Browse Source

wip: progress on redux folder store

Torkel Ödegaard 7 năm trước cách đây
mục cha
commit
679ffbfd83

+ 2 - 2
public/app/core/actions/index.ts

@@ -1,4 +1,4 @@
 import { updateLocation } from './location';
-import { updateNavIndex } from './navModel';
+import { updateNavIndex, UpdateNavIndexAction } from './navModel';
 
-export { updateLocation, updateNavIndex };
+export { updateLocation, updateNavIndex, UpdateNavIndexAction };

+ 37 - 2
public/app/features/manage-dashboards/state/actions.ts

@@ -1,7 +1,8 @@
 import { getBackendSrv } from 'app/core/services/backend_srv';
 import { StoreState } from 'app/types';
 import { ThunkAction } from 'redux-thunk';
-import { FolderDTO } from 'app/types';
+import { FolderDTO, NavModelItem } from 'app/types';
+import { updateNavIndex, UpdateNavIndexAction } from 'app/core/actions';
 
 export enum ActionTypes {
   LoadFolder = 'LOAD_FOLDER',
@@ -19,11 +20,45 @@ export const loadFolder = (folder: FolderDTO): LoadFolderAction => ({
 
 export type Action = LoadFolderAction;
 
-type ThunkResult<R> = ThunkAction<R, StoreState, undefined, Action>;
+type ThunkResult<R> = ThunkAction<R, StoreState, undefined, Action | UpdateNavIndexAction>;
 
+function buildNavModel(folder: FolderDTO): NavModelItem {
+  return {
+    icon: 'fa fa-folder-open',
+    id: 'manage-folder',
+    subTitle: 'Manage folder dashboards & permissions',
+    url: '',
+    text: folder.title,
+    breadcrumbs: [{ title: 'Dashboards', url: 'dashboards' }],
+    children: [
+      {
+        active: false,
+        icon: 'fa fa-fw fa-th-large',
+        id: `folder-dashboards-${folder.uid}`,
+        text: 'Dashboards',
+        url: folder.url,
+      },
+      {
+        active: false,
+        icon: 'fa fa-fw fa-lock',
+        id: `folder-permissions-${folder.uid}`,
+        text: 'Permissions',
+        url: `${folder.url}/permissions`,
+      },
+      {
+        active: false,
+        icon: 'fa fa-fw fa-cog',
+        id: `folder-settings-${folder.uid}`,
+        text: 'Settings',
+        url: `${folder.url}/settings`,
+      },
+    ],
+  };
+}
 export function getFolderByUid(uid: string): ThunkResult<void> {
   return async dispatch => {
     const folder = await getBackendSrv().getFolderByUid(uid);
     dispatch(loadFolder(folder));
+    dispatch(updateNavIndex(buildNavModel(folder)));
   };
 }

+ 20 - 0
public/app/features/manage-dashboards/state/reducers.ts

@@ -0,0 +1,20 @@
+import { FolderState } from 'app/types';
+import { Action, ActionTypes } from './actions';
+
+export const inititalState: FolderState = null;
+
+export const folderReducer = (state = inititalState, action: Action): FolderState => {
+  switch (action.type) {
+    case ActionTypes.LoadFolder:
+      return {
+        ...action.payload,
+        canSave: false,
+        hasChanged: false,
+      };
+  }
+  return state;
+};
+
+export default {
+  folder: folderReducer,
+};

+ 2 - 0
public/app/stores/configureStore.ts

@@ -4,11 +4,13 @@ import { createLogger } from 'redux-logger';
 import sharedReducers from 'app/core/reducers';
 import alertingReducers from 'app/features/alerting/state/reducers';
 import teamsReducers from 'app/features/teams/state/reducers';
+import manageDashboardsReducers from 'app/features/manage-dashboards/state/reducers';
 
 const rootReducer = combineReducers({
   ...sharedReducers,
   ...alertingReducers,
   ...teamsReducers,
+  ...manageDashboardsReducers,
 });
 
 export let store;

+ 11 - 1
public/app/types/dashboard.ts

@@ -1,7 +1,17 @@
 export interface FolderDTO {
   id: number;
+  uid: string;
   title: string;
   url: string;
   version: number;
-  hasAcl: boolean;
+}
+
+export interface FolderState {
+  id: number;
+  uid: string;
+  title: string;
+  url: string;
+  version: number;
+  canSave: boolean;
+  hasChanged: boolean;
 }

+ 3 - 2
public/app/types/index.ts

@@ -1,6 +1,6 @@
-import { FolderDTO } from './dashboard';
+import { FolderDTO, FolderState } from './dashboard';
 
-export { FolderDTO };
+export { FolderDTO, FolderState };
 
 //
 // Location
@@ -136,4 +136,5 @@ export interface StoreState {
   alertRules: AlertRulesState;
   teams: TeamsState;
   team: TeamState;
+  folder: FolderState;
 }