summaryrefslogtreecommitdiffstats
path: root/front/odiparpack/app/redux/modules
diff options
context:
space:
mode:
authorgabrhr <[email protected]>2022-04-20 10:19:29 -0500
committergabrhr <[email protected]>2022-04-20 10:19:29 -0500
commite13e630cd6e4fc0b1ff92098a28a770794c7bb9a (patch)
treee68ad2f947d1b3ec454529b35f37ca2f223e5431 /front/odiparpack/app/redux/modules
parent457816ac1129fcc6019d2fc795b6693ee6776d59 (diff)
downloadDP1_project-e13e630cd6e4fc0b1ff92098a28a770794c7bb9a.tar.gz
DP1_project-e13e630cd6e4fc0b1ff92098a28a770794c7bb9a.tar.bz2
DP1_project-e13e630cd6e4fc0b1ff92098a28a770794c7bb9a.zip
AƱadir plantilla
Base para front
Diffstat (limited to 'front/odiparpack/app/redux/modules')
-rw-r--r--front/odiparpack/app/redux/modules/calendar.js79
-rw-r--r--front/odiparpack/app/redux/modules/chat.js73
-rw-r--r--front/odiparpack/app/redux/modules/contact.js131
-rw-r--r--front/odiparpack/app/redux/modules/crudTable.js94
-rw-r--r--front/odiparpack/app/redux/modules/crudTableForm.js99
-rw-r--r--front/odiparpack/app/redux/modules/ecommerce.js94
-rw-r--r--front/odiparpack/app/redux/modules/email.js119
-rw-r--r--front/odiparpack/app/redux/modules/initForm.js22
-rw-r--r--front/odiparpack/app/redux/modules/login.js19
-rw-r--r--front/odiparpack/app/redux/modules/socialMedia.js110
-rw-r--r--front/odiparpack/app/redux/modules/treeTable.js49
-rw-r--r--front/odiparpack/app/redux/modules/ui.js95
12 files changed, 984 insertions, 0 deletions
diff --git a/front/odiparpack/app/redux/modules/calendar.js b/front/odiparpack/app/redux/modules/calendar.js
new file mode 100644
index 0000000..fb1291d
--- /dev/null
+++ b/front/odiparpack/app/redux/modules/calendar.js
@@ -0,0 +1,79 @@
+import { fromJS, List, Map } from 'immutable';
+import notif from 'ba-api/notifMessage';
+import {
+ FETCH_CALENDAR_DATA,
+ ADD_EVENT,
+ DISCARD_EVENT,
+ SUBMIT_EVENT,
+ DELETE_EVENT,
+ CLOSE_NOTIF
+} from 'ba-actions/actionTypes';
+
+const initialState = {
+ events: List([]),
+ openFrm: false,
+ formValues: Map(),
+ notifMsg: '',
+};
+
+const initForm = Map({
+ title: '',
+ start: new Date(),
+ end: new Date(),
+ hexColor: 'F8BBD0',
+});
+
+const initialImmutableState = fromJS(initialState);
+export default function reducer(state = initialImmutableState, action = {}) {
+ switch (action.type) {
+ case FETCH_CALENDAR_DATA:
+ return state.withMutations((mutableState) => {
+ const items = fromJS(action.items);
+ mutableState.set('events', items);
+ });
+ case ADD_EVENT:
+ return state.withMutations((mutableState) => {
+ mutableState
+ .set('openFrm', true)
+ .set('formValues', initForm);
+ });
+ case DISCARD_EVENT:
+ return state.withMutations((mutableState) => {
+ mutableState
+ .set('openFrm', false)
+ .set('formValues', Map())
+ .set('notifMsg', notif.discard);
+ });
+ case SUBMIT_EVENT:
+ return state.withMutations((mutableState) => {
+ const initItem = Map(action.newEvent);
+ const id = (+new Date() + Math.floor(Math.random() * 999999)).toString(36);
+ const newItem = initItem
+ .update('id', (val = id) => val)
+ .set('start', action.newEvent.get('start')._d || action.newEvent.get('start'))
+ .set('end', action.newEvent.get('end')._d || action.newEvent.get('end'));
+ mutableState.update('events', events => events.push(newItem));
+ mutableState
+ .set('formValues', Map())
+ .set('openFrm', false)
+ .set('notifMsg', notif.saved);
+ });
+ case DELETE_EVENT:
+ return state.withMutations((mutableState) => {
+ const eventItem = state.get('events')
+ .find(obj => (
+ obj.get('id') === action.event.id
+ ));
+ const index = state.get('events').indexOf(eventItem);
+ mutableState
+ .update('events', events => events.splice(index, 1))
+ .set('notifMsg', notif.removed);
+ });
+ case CLOSE_NOTIF:
+ return state.withMutations((mutableState) => {
+ mutableState.set('notifMsg', '');
+ });
+ default:
+ return state;
+ }
+}
diff --git a/front/odiparpack/app/redux/modules/chat.js b/front/odiparpack/app/redux/modules/chat.js
new file mode 100644
index 0000000..e30c97a
--- /dev/null
+++ b/front/odiparpack/app/redux/modules/chat.js
@@ -0,0 +1,73 @@
+import { fromJS, List, Map } from 'immutable';
+import {
+ FETCH_CHAT_DATA,
+ SHOW_CHAT,
+ HIDE_CHAT,
+ SEND_CHAT,
+ DELETE_CONVERSATION
+} from 'ba-actions/actionTypes';
+import { getDate, getTime } from '../helpers/dateTimeHelper';
+
+const initialState = {
+ chatList: List([]),
+ activeChat: List([]),
+ chatSelected: 0,
+ showMobileDetail: false
+};
+
+const buildMessage = (message, curData) => {
+ const id = (+new Date() + Math.floor(Math.random() * 999999)).toString(36);
+ const newData = Map({
+ id,
+ from: 'me',
+ date: getDate(),
+ time: getTime(),
+ message,
+ });
+ return curData.push(newData);
+};
+
+const initialImmutableState = fromJS(initialState);
+export default function reducer(state = initialImmutableState, action = {}) {
+ switch (action.type) {
+ case FETCH_CHAT_DATA:
+ return state.withMutations((mutableState) => {
+ const items = fromJS(action.items);
+ mutableState
+ .set('chatList', items)
+ .set('activeChat', items.getIn([state.get('chatSelected'), 'chat']));
+ });
+ case SHOW_CHAT:
+ return state.withMutations((mutableState) => {
+ const chatItem = state.get('chatList')
+ .find(obj => (
+ obj.get('with') === action.person.get('id')
+ ));
+ const index = state.get('chatList').indexOf(chatItem);
+ const chatValue = chatItem.get('chat') !== [] ? chatItem.get('chat') : List([]);
+ mutableState
+ .set('chatSelected', index)
+ .set('activeChat', chatValue)
+ .set('showMobileDetail', true);
+ });
+ case HIDE_CHAT:
+ return state.withMutations((mutableState) => {
+ mutableState.set('showMobileDetail', false);
+ });
+ case SEND_CHAT:
+ return state.withMutations((mutableState) => {
+ const newMessage = buildMessage(action.message, state.getIn(['chatList', state.get('chatSelected'), 'chat']));
+ mutableState
+ .update('chatList', chatList => chatList.setIn([state.get('chatSelected'), 'chat'], newMessage))
+ .set('activeChat', newMessage);
+ });
+ case DELETE_CONVERSATION:
+ return state.withMutations((mutableState) => {
+ mutableState
+ .update('chatList', chatList => chatList.setIn([state.get('chatSelected'), 'chat'], List([])))
+ .set('activeChat', List([]));
+ });
+ default:
+ return state;
+ }
+}
diff --git a/front/odiparpack/app/redux/modules/contact.js b/front/odiparpack/app/redux/modules/contact.js
new file mode 100644
index 0000000..bf34a8b
--- /dev/null
+++ b/front/odiparpack/app/redux/modules/contact.js
@@ -0,0 +1,131 @@
+import { fromJS, List, Map } from 'immutable';
+import notif from 'ba-api/notifMessage';
+import {
+ FETCH_CONTACT_DATA,
+ SEARCH_CONTACT,
+ SHOW_DETAIL_CONTACT,
+ HIDE_DETAIL,
+ EDIT_CONTACT,
+ SUBMIT_CONTACT,
+ DELETE_CONTACT,
+ TOGGLE_FAVORITE,
+ ADD_CONTACT,
+ CLOSE_CONTACT_FORM,
+ CLOSE_NOTIF
+} from 'ba-actions/actionTypes';
+
+const initialState = {
+ contactList: List([]),
+ formValues: Map(),
+ selectedIndex: 0,
+ selectedId: '',
+ keywordValue: '',
+ avatarInit: '',
+ openFrm: false,
+ showMobileDetail: false,
+ notifMsg: '',
+};
+let editingIndex = 0;
+
+const initialImmutableState = fromJS(initialState);
+
+export default function reducer(state = initialImmutableState, action = {}) {
+ switch (action.type) {
+ case FETCH_CONTACT_DATA:
+ return state.withMutations((mutableState) => {
+ const items = fromJS(action.items);
+ mutableState.set('contactList', items);
+ });
+ case SEARCH_CONTACT:
+ return state.withMutations((mutableState) => {
+ action.keyword.persist();
+ const keyword = action.keyword.target.value.toLowerCase();
+ mutableState.set('keywordValue', keyword);
+ });
+ case ADD_CONTACT:
+ return state.withMutations((mutableState) => {
+ mutableState
+ .set('openFrm', true)
+ .set('formValues', Map())
+ .set('avatarInit', '');
+ });
+ case CLOSE_CONTACT_FORM:
+ return state.withMutations((mutableState) => {
+ mutableState
+ .set('openFrm', false)
+ .set('formValues', Map())
+ .set('avatarInit', '')
+ .set('notifMsg', notif.discard);
+ });
+ case EDIT_CONTACT:
+ return state.withMutations((mutableState) => {
+ editingIndex = state.get('contactList').indexOf(action.item);
+ mutableState
+ .set('openFrm', true)
+ .set('selectedId', action.item.get('id'))
+ .set('formValues', action.item)
+ .set('avatarInit', action.item.get('avatar'));
+ });
+ case SUBMIT_CONTACT:
+ return state.withMutations((mutableState) => {
+ const initItem = Map(action.newData);
+ if (state.get('selectedId') === action.newData.get('id')) {
+ // Update data
+ const avatar = action.avatar !== '' ? action.avatar : state.get('avatarInit');
+ const newItem = initItem.update((initUpdated) => (initUpdated.set('avatar', avatar)));
+ mutableState
+ .update('contactList', contactList => contactList.setIn(
+ [editingIndex], newItem
+ ))
+ .set('notifMsg', notif.updated);
+ } else {
+ // Insert data
+ const avatar = action.avatar !== '' ? action.avatar : '/images/pp_boy.svg';
+ const id = (+new Date() + Math.floor(Math.random() * 999999)).toString(36);
+ const newItem = initItem
+ .update('id', (val = id) => val)
+ .update('avatar', (val = avatar) => val)
+ .update('favorited', (val = false) => val);
+ mutableState
+ .update('contactList', contactList => contactList.unshift(newItem))
+ .set('selectedIndex', 0)
+ .set('notifMsg', notif.saved);
+ }
+ mutableState
+ .set('formValues', null)
+ .set('avatarInit', '')
+ .set('openFrm', false);
+ });
+ case SHOW_DETAIL_CONTACT:
+ return state.withMutations((mutableState) => {
+ const index = state.get('contactList').indexOf(action.item);
+ mutableState
+ .set('selectedIndex', index)
+ .set('showMobileDetail', true);
+ });
+ case HIDE_DETAIL:
+ return state.withMutations((mutableState) => {
+ mutableState.set('showMobileDetail', false);
+ });
+ case DELETE_CONTACT:
+ return state.withMutations((mutableState) => {
+ const index = state.get('contactList').indexOf(action.item);
+ mutableState
+ .update('contactList', contactList => contactList.splice(index, 1))
+ .set('notifMsg', notif.removed);
+ });
+ case TOGGLE_FAVORITE:
+ return state.withMutations((mutableState) => {
+ const index = state.get('contactList').indexOf(action.item);
+ mutableState.update('contactList', contactList => contactList
+ .setIn([index, 'favorited'], !state.getIn(['contactList', index, 'favorited']))
+ );
+ });
+ case CLOSE_NOTIF:
+ return state.withMutations((mutableState) => {
+ mutableState.set('notifMsg', '');
+ });
+ default:
+ return state;
+ }
+}
diff --git a/front/odiparpack/app/redux/modules/crudTable.js b/front/odiparpack/app/redux/modules/crudTable.js
new file mode 100644
index 0000000..2bdb1e8
--- /dev/null
+++ b/front/odiparpack/app/redux/modules/crudTable.js
@@ -0,0 +1,94 @@
+import { fromJS, List, Map } from 'immutable';
+import notif from 'ba-api/notifMessage';
+import {
+ FETCH_DATA,
+ ADD_EMPTY_ROW,
+ UPDATE_ROW,
+ REMOVE_ROW,
+ EDIT_ROW,
+ SAVE_ROW,
+ CLOSE_NOTIF
+} from 'ba-actions/actionTypes';
+
+const initialState = {
+ dataTable: List([]),
+ notifMsg: '',
+};
+
+const initialItem = (keyTemplate, anchor) => {
+ const [...rawKey] = keyTemplate.keys();
+ const staticKey = {
+ id: (+new Date() + Math.floor(Math.random() * 999999)).toString(36),
+ };
+ for (let i = 0; i < rawKey.length; i += 1) {
+ if (rawKey[i] !== 'id' && rawKey[i] !== 'edited') {
+ staticKey[rawKey[i]] = anchor[i].initialValue;
+ }
+ }
+ // Push another static key
+ staticKey.edited = true;
+
+ return Map(staticKey);
+};
+
+const initialImmutableState = fromJS(initialState);
+
+export default function reducer(state = initialImmutableState, action = {}) {
+ const { branch } = action;
+ switch (action.type) {
+ case `${branch}/${FETCH_DATA}`:
+ return state.withMutations((mutableState) => {
+ const items = fromJS(action.items);
+ mutableState.set('dataTable', items);
+ });
+ case `${branch}/${ADD_EMPTY_ROW}`:
+ return state.withMutations((mutableState) => {
+ const raw = state.get('dataTable').last();
+ const initial = initialItem(raw, action.anchor);
+ mutableState.update('dataTable', dataTable => dataTable.unshift(initial));
+ });
+ case `${branch}/${REMOVE_ROW}`:
+ return state.withMutations((mutableState) => {
+ const index = state.get('dataTable').indexOf(action.item);
+ mutableState
+ .update('dataTable', dataTable => dataTable.splice(index, 1))
+ .set('notifMsg', notif.removed);
+ });
+ case `${branch}/${UPDATE_ROW}`:
+ return state.withMutations((mutableState) => {
+ const index = state.get('dataTable').indexOf(action.item);
+ const cellTarget = action.event.target.name;
+ const newVal = type => {
+ if (type === 'checkbox') {
+ return action.event.target.checked;
+ }
+ return action.event.target.value;
+ };
+ mutableState.update('dataTable', dataTable => dataTable
+ .setIn([index, cellTarget], newVal(action.event.target.type))
+ );
+ });
+ case `${branch}/${EDIT_ROW}`:
+ return state.withMutations((mutableState) => {
+ const index = state.get('dataTable').indexOf(action.item);
+ mutableState.update('dataTable', dataTable => dataTable
+ .setIn([index, 'edited'], true)
+ );
+ });
+ case `${branch}/${SAVE_ROW}`:
+ return state.withMutations((mutableState) => {
+ const index = state.get('dataTable').indexOf(action.item);
+ mutableState
+ .update('dataTable', dataTable => dataTable
+ .setIn([index, 'edited'], false)
+ )
+ .set('notifMsg', notif.saved);
+ });
+ case `${branch}/${CLOSE_NOTIF}`:
+ return state.withMutations((mutableState) => {
+ mutableState.set('notifMsg', '');
+ });
+ default:
+ return state;
+ }
+}
diff --git a/front/odiparpack/app/redux/modules/crudTableForm.js b/front/odiparpack/app/redux/modules/crudTableForm.js
new file mode 100644
index 0000000..d5194c1
--- /dev/null
+++ b/front/odiparpack/app/redux/modules/crudTableForm.js
@@ -0,0 +1,99 @@
+import { fromJS, List, Map } from 'immutable';
+import notif from 'ba-api/notifMessage';
+import {
+ FETCH_DATA_FORM,
+ ADD_NEW,
+ CLOSE_FORM,
+ SUBMIT_DATA,
+ REMOVE_ROW_FORM,
+ EDIT_ROW_FORM,
+ CLOSE_NOTIF
+} from 'ba-actions/actionTypes';
+
+const initialState = {
+ dataTable: List([]),
+ formValues: Map(),
+ editingId: '',
+ showFrm: false,
+ notifMsg: '',
+};
+
+const initialItem = (keyTemplate, anchor) => {
+ const [...rawKey] = keyTemplate.keys();
+ const staticKey = {};
+ for (let i = 0; i < rawKey.length; i += 1) {
+ if (rawKey[i] !== 'id') {
+ const itemIndex = anchor.findIndex(a => a.name === rawKey[i]);
+ staticKey[rawKey[i]] = anchor[itemIndex].initialValue;
+ }
+ }
+
+ return Map(staticKey);
+};
+let editingIndex = 0;
+
+const initialImmutableState = fromJS(initialState);
+
+export default function reducer(state = initialImmutableState, action = {}) {
+ const { branch } = action;
+ switch (action.type) {
+ case `${branch}/${FETCH_DATA_FORM}`:
+ return state.withMutations((mutableState) => {
+ const items = fromJS(action.items);
+ mutableState.set('dataTable', items);
+ });
+ case `${branch}/${ADD_NEW}`:
+ return state.withMutations((mutableState) => {
+ const raw = state.get('dataTable').last();
+ const initial = initialItem(raw, action.anchor);
+ mutableState.set('formValues', initial);
+ mutableState.set('showFrm', true);
+ });
+ case `${branch}/${SUBMIT_DATA}`:
+ return state.withMutations((mutableState) => {
+ if (state.get('editingId') === action.newData.get('id')) {
+ // Update data
+ mutableState
+ .update('dataTable', dataTable => dataTable.setIn([editingIndex], action.newData))
+ .set('notifMsg', notif.updated);
+ } else {
+ // Insert data
+ const id = (+new Date() + Math.floor(Math.random() * 999999)).toString(36);
+ const initItem = Map(action.newData);
+ const newItem = initItem.update('id', (val = id) => val);
+ mutableState
+ .update('dataTable', dataTable => dataTable.unshift(newItem))
+ .set('notifMsg', notif.saved);
+ }
+ mutableState.set('showFrm', false);
+ mutableState.set('formValues', Map());
+ });
+ case `${branch}/${CLOSE_FORM}`:
+ return state.withMutations((mutableState) => {
+ mutableState
+ .set('formValues', Map())
+ .set('showFrm', false);
+ });
+ case `${branch}/${REMOVE_ROW_FORM}`:
+ return state.withMutations((mutableState) => {
+ const index = state.get('dataTable').indexOf(action.item);
+ mutableState
+ .update('dataTable', dataTable => dataTable.splice(index, 1))
+ .set('notifMsg', notif.removed);
+ });
+ case `${branch}/${EDIT_ROW_FORM}`:
+ return state.withMutations((mutableState) => {
+ editingIndex = state.get('dataTable').indexOf(action.item);
+ mutableState
+ .set('formValues', action.item)
+ .set('editingId', action.item.get('id'))
+ .set('showFrm', true);
+ });
+ case `${branch}/${CLOSE_NOTIF}`:
+ return state.withMutations((mutableState) => {
+ mutableState.set('notifMsg', '');
+ });
+ default:
+ return state;
+ }
+}
diff --git a/front/odiparpack/app/redux/modules/ecommerce.js b/front/odiparpack/app/redux/modules/ecommerce.js
new file mode 100644
index 0000000..a294bae
--- /dev/null
+++ b/front/odiparpack/app/redux/modules/ecommerce.js
@@ -0,0 +1,94 @@
+import { fromJS, List } from 'immutable';
+import notif from 'ba-api/notifMessage';
+import {
+ FETCH_PRODUCT_DATA,
+ ADD_TO_CART,
+ DELETE_CART_ITEM,
+ CHECKOUT,
+ SHOW_DETAIL_PRODUCT,
+ SEARCH_PRODUCT,
+ CLOSE_NOTIF
+} from 'ba-actions/actionTypes';
+
+const initialState = {
+ productList: List([]),
+ cart: List([]),
+ totalItems: 0,
+ totalPrice: 0,
+ productIndex: 0,
+ keywordValue: '',
+ notifMsg: '',
+};
+
+let itemId = [];
+
+const initialImmutableState = fromJS(initialState);
+export default function reducer(state = initialImmutableState, action = {}) {
+ switch (action.type) {
+ case FETCH_PRODUCT_DATA:
+ return state.withMutations((mutableState) => {
+ const items = fromJS(action.items);
+ mutableState.set('productList', items);
+ });
+ case SEARCH_PRODUCT:
+ return state.withMutations((mutableState) => {
+ action.keyword.persist();
+ const keyword = action.keyword.target.value.toLowerCase();
+ mutableState.set('keywordValue', keyword);
+ });
+ case ADD_TO_CART:
+ return state.withMutations((mutableState) => {
+ const item = fromJS(action.item);
+ const qty = Number(item.get('quantity'));
+ const price = item.get('price');
+ const index = itemId.indexOf(action.item.id);
+ if (index > -1) {
+ // If item already added to cart
+ mutableState.update('cart', cart => cart.setIn(
+ [index, 'quantity'],
+ state.getIn(['cart', index, 'quantity']) + qty
+ ));
+ } else {
+ // item not exist in cart
+ itemId.push(action.item.id);
+ mutableState.update('cart', cart => cart.push(item));
+ }
+ mutableState
+ .set('totalItems', state.get('totalItems') + qty)
+ .set('totalPrice', state.get('totalPrice') + (price * qty))
+ .set('notifMsg', notif.addCart);
+ });
+ case DELETE_CART_ITEM:
+ return state.withMutations((mutableState) => {
+ const index = state.get('cart').indexOf(action.item);
+ const qty = Number(action.item.get('quantity'));
+ const price = action.item.get('price');
+ itemId = itemId.filter(item => item !== action.item.get('id'));
+ mutableState
+ .update('cart', cart => cart.splice(index, 1))
+ .set('totalItems', state.get('totalItems') - qty)
+ .set('totalPrice', state.get('totalPrice') - (price * qty))
+ .set('notifMsg', notif.removed);
+ });
+ case CHECKOUT:
+ itemId = [];
+ return state.withMutations((mutableState) => {
+ mutableState
+ .set('cart', List([]))
+ .set('totalItems', 0)
+ .set('totalPrice', 0)
+ .set('notifMsg', notif.checkout);
+ });
+ case SHOW_DETAIL_PRODUCT:
+ return state.withMutations((mutableState) => {
+ const index = state.get('productList').indexOf(action.item);
+ mutableState.set('productIndex', index);
+ });
+ case CLOSE_NOTIF:
+ return state.withMutations((mutableState) => {
+ mutableState.set('notifMsg', '');
+ });
+ default:
+ return state;
+ }
+}
diff --git a/front/odiparpack/app/redux/modules/email.js b/front/odiparpack/app/redux/modules/email.js
new file mode 100644
index 0000000..e103316
--- /dev/null
+++ b/front/odiparpack/app/redux/modules/email.js
@@ -0,0 +1,119 @@
+import { fromJS, List, Map } from 'immutable';
+import notif from 'ba-api/notifMessage';
+import dummyData from 'ba-api/dummyContents';
+import {
+ FETCH_EMAIL_DATA,
+ OPEN_MAIL,
+ FILTER_MAIL,
+ COMPOSE_MAIL,
+ SEND_MAIL,
+ DISCARD_MESSAGE,
+ SEARCH_MAIL,
+ DELETE_MAIL,
+ MOVE_TO,
+ TOGGLE_STARED,
+ CLOSE_NOTIF
+} from 'ba-actions/actionTypes';
+import { getDate, getTime } from '../helpers/dateTimeHelper';
+
+const initialState = {
+ inbox: List([]),
+ selectedMail: 0,
+ selectedMailId: '',
+ keywordValue: '',
+ currentPage: 'inbox',
+ openFrm: false,
+ notifMsg: '',
+};
+
+const buildMessage = (to, subject, content, files) => {
+ const id = (+new Date() + Math.floor(Math.random() * 999999)).toString(36);
+ const newData = Map({
+ id,
+ date: getDate(),
+ time: getTime(),
+ avatar: dummyData.user.avatar,
+ name: to,
+ subject,
+ content,
+ attachment: files,
+ category: 'sent',
+ stared: false,
+ });
+ return newData;
+};
+
+const initialImmutableState = fromJS(initialState);
+export default function reducer(state = initialImmutableState, action = {}) {
+ switch (action.type) {
+ case FETCH_EMAIL_DATA:
+ return state.withMutations((mutableState) => {
+ const items = fromJS(action.items);
+ mutableState.set('inbox', items);
+ });
+ case OPEN_MAIL:
+ return state.withMutations((mutableState) => {
+ const index = state.get('inbox').indexOf(action.mail);
+ mutableState.set('selectedMail', index);
+ });
+ case FILTER_MAIL:
+ return state.withMutations((mutableState) => {
+ mutableState.set('currentPage', action.filter);
+ });
+ case COMPOSE_MAIL:
+ return state.withMutations((mutableState) => {
+ mutableState.set('openFrm', true);
+ });
+ case SEND_MAIL:
+ return state.withMutations((mutableState) => {
+ const newMail = buildMessage(action.to, action.subject, action.content, action.attachment);
+ mutableState
+ .update('inbox', inbox => inbox.unshift(newMail))
+ .set('selectedMailId', '')
+ .set('openFrm', false)
+ .set('notifMsg', notif.sent);
+ });
+ case DISCARD_MESSAGE:
+ return state.withMutations((mutableState) => {
+ mutableState
+ .set('openFrm', false)
+ .set('selectedMailId', '')
+ .set('notifMsg', notif.discard);
+ });
+ case SEARCH_MAIL:
+ return state.withMutations((mutableState) => {
+ action.keyword.persist();
+ const keyword = action.keyword.target.value.toLowerCase();
+ mutableState.set('keywordValue', keyword);
+ });
+ case DELETE_MAIL:
+ return state.withMutations((mutableState) => {
+ const index = state.get('inbox').indexOf(action.mail);
+ mutableState
+ .update('inbox', inbox => inbox.splice(index, 1))
+ .set('notifMsg', notif.removed);
+ });
+ case TOGGLE_STARED:
+ return state.withMutations((mutableState) => {
+ const index = state.get('inbox').indexOf(action.mail);
+ mutableState.update('inbox', inbox => inbox
+ .setIn([index, 'stared'], !state.getIn(['inbox', index, 'stared']))
+ );
+ });
+ case MOVE_TO:
+ return state.withMutations((mutableState) => {
+ const index = state.get('inbox').indexOf(action.mail);
+ mutableState
+ .update('inbox', inbox => inbox
+ .setIn([index, 'category'], action.category)
+ )
+ .set('notifMsg', notif.labeled);
+ });
+ case CLOSE_NOTIF:
+ return state.withMutations((mutableState) => {
+ mutableState.set('notifMsg', '');
+ });
+ default:
+ return state;
+ }
+}
diff --git a/front/odiparpack/app/redux/modules/initForm.js b/front/odiparpack/app/redux/modules/initForm.js
new file mode 100644
index 0000000..82bd90b
--- /dev/null
+++ b/front/odiparpack/app/redux/modules/initForm.js
@@ -0,0 +1,22 @@
+import { fromJS, Map } from 'immutable';
+import { INIT, CLEAR } from 'ba-actions/actionTypes';
+
+const initialState = {
+ formValues: Map()
+};
+
+const initialImmutableState = fromJS(initialState);
+export default function reducer(state = initialImmutableState, action = {}) {
+ switch (action.type) {
+ case INIT:
+ return state.withMutations((mutableState) => {
+ mutableState.set('formValues', action.data);
+ });
+ case CLEAR:
+ return state.withMutations((mutableState) => {
+ mutableState.set('formValues', []);
+ });
+ default:
+ return state;
+ }
+}
diff --git a/front/odiparpack/app/redux/modules/login.js b/front/odiparpack/app/redux/modules/login.js
new file mode 100644
index 0000000..add50fb
--- /dev/null
+++ b/front/odiparpack/app/redux/modules/login.js
@@ -0,0 +1,19 @@
+import { Map, fromJS } from 'immutable';
+import { INIT } from 'ba-actions/actionTypes';
+
+const initialState = {
+ usersLogin: Map({
+ email: '[email protected]',
+ password: '12345678',
+ remember: false
+ })
+};
+const initialImmutableState = fromJS(initialState);
+export default function reducer(state = initialImmutableState, action = {}) {
+ switch (action.type) {
+ case INIT:
+ return state;
+ default:
+ return state;
+ }
+}
diff --git a/front/odiparpack/app/redux/modules/socialMedia.js b/front/odiparpack/app/redux/modules/socialMedia.js
new file mode 100644
index 0000000..a775f49
--- /dev/null
+++ b/front/odiparpack/app/redux/modules/socialMedia.js
@@ -0,0 +1,110 @@
+import { fromJS, List, Map } from 'immutable';
+import notif from 'ba-api/notifMessage';
+import dummy from 'ba-api/dummyContents';
+import {
+ FETCH_TIMELINE_DATA,
+ POST,
+ TOGGLE_LIKE,
+ FETCH_COMMENT_DATA,
+ POST_COMMENT,
+ CLOSE_NOTIF
+} from 'ba-actions/actionTypes';
+import { getDate, getTime } from '../helpers/dateTimeHelper';
+
+const initialState = {
+ dataTimeline: List([]),
+ commentIndex: 0,
+ notifMsg: '',
+};
+
+const icon = privacyType => {
+ switch (privacyType) {
+ case 'public':
+ return 'language';
+ case 'friends':
+ return 'people';
+ default:
+ return 'lock';
+ }
+};
+
+const buildTimeline = (text, image, privacy) => {
+ const id = (+new Date() + Math.floor(Math.random() * 999999)).toString(36);
+ const imageSrc = image !== undefined ? URL.createObjectURL(image[0]) : '';
+ return Map({
+ id,
+ name: 'John Doe',
+ date: getDate(),
+ time: getTime(),
+ icon: icon(privacy),
+ avatar: dummy.user.avatar,
+ image: imageSrc,
+ content: text,
+ liked: false,
+ comments: List([])
+ });
+};
+
+const buildComment = (message, curData) => {
+ const id = (+new Date() + Math.floor(Math.random() * 999999)).toString(36);
+ const newData = Map({
+ id,
+ from: 'John Doe',
+ avatar: dummy.user.avatar,
+ date: getDate(),
+ message,
+ });
+ return curData.push(newData);
+};
+
+const initialImmutableState = fromJS(initialState);
+
+export default function reducer(state = initialImmutableState, action = {}) {
+ switch (action.type) {
+ case FETCH_TIMELINE_DATA:
+ return state.withMutations((mutableState) => {
+ const items = fromJS(action.items);
+ mutableState.set('dataTimeline', items);
+ });
+ case POST:
+ return state.withMutations((mutableState) => {
+ mutableState
+ .update(
+ 'dataTimeline',
+ dataTimeline => dataTimeline.unshift(
+ buildTimeline(action.text, action.media, action.privacy)
+ )
+ )
+ .set('notifMsg', notif.posted);
+ });
+ case TOGGLE_LIKE:
+ return state.withMutations((mutableState) => {
+ const index = state.get('dataTimeline').indexOf(action.item);
+ mutableState.update('dataTimeline', dataTimeline => dataTimeline
+ .setIn([index, 'liked'], !state.getIn(['dataTimeline', index, 'liked']))
+ );
+ });
+ case FETCH_COMMENT_DATA:
+ return state.withMutations((mutableState) => {
+ const index = state.get('dataTimeline').indexOf(action.item);
+ mutableState.set('commentIndex', index);
+ });
+ case POST_COMMENT:
+ return state.withMutations((mutableState) => {
+ mutableState
+ .update('dataTimeline',
+ dataTimeline => dataTimeline.setIn(
+ [state.get('commentIndex'), 'comments'],
+ buildComment(action.comment, state.getIn(['dataTimeline', state.get('commentIndex'), 'comments']))
+ )
+ )
+ .set('notifMsg', notif.commented);
+ });
+ case CLOSE_NOTIF:
+ return state.withMutations((mutableState) => {
+ mutableState.set('notifMsg', '');
+ });
+ default:
+ return state;
+ }
+}
diff --git a/front/odiparpack/app/redux/modules/treeTable.js b/front/odiparpack/app/redux/modules/treeTable.js
new file mode 100644
index 0000000..96fa08a
--- /dev/null
+++ b/front/odiparpack/app/redux/modules/treeTable.js
@@ -0,0 +1,49 @@
+import { fromJS, List } from 'immutable';
+import { TOGGLE_TREE } from 'ba-actions/actionTypes';
+
+const initialState = {
+ treeOpen: List([]),
+ arrowMore: List([])
+};
+
+const initialImmutableState = fromJS(initialState);
+
+// Collect existing child and parent id's
+function collectId(id, listedId, collapsed, arrowLess) {
+ arrowLess.push(id);
+ for (let i = 0; i < listedId.size; i += 1) {
+ if (listedId.getIn([i]).startsWith(id + '_')) {
+ collapsed.push(listedId.getIn([i]));
+ arrowLess.push(listedId.getIn([i]));
+ }
+ }
+}
+
+export default function reducer(state = initialImmutableState, action = {}) {
+ const { branch } = action;
+ switch (action.type) {
+ case `${branch}/${TOGGLE_TREE}`:
+ return state.withMutations((mutableState) => {
+ const listedId = state.get('treeOpen');
+ const collapsed = [];
+ const arrowLess = [];
+
+ // Collect existing id
+ collectId(action.keyID, listedId, collapsed, arrowLess);
+
+ // Collapse and Expand row
+ if (collapsed.length > 0) { // Collapse tree table
+ mutableState.update('treeOpen', treeOpen => treeOpen.filter(x => collapsed.indexOf(x) < 0));
+ mutableState.update('arrowMore', arrowMore => arrowMore.filter(x => arrowLess.indexOf(x) < 0));
+ } else { // Expand tree table
+ mutableState.update('arrowMore', arrowMore => arrowMore.push(action.keyID));
+ action.child.map(item => {
+ mutableState.update('treeOpen', treeOpen => treeOpen.push(item.id));
+ return true;
+ });
+ }
+ });
+ default:
+ return state;
+ }
+}
diff --git a/front/odiparpack/app/redux/modules/ui.js b/front/odiparpack/app/redux/modules/ui.js
new file mode 100644
index 0000000..a0fa4e6
--- /dev/null
+++ b/front/odiparpack/app/redux/modules/ui.js
@@ -0,0 +1,95 @@
+import { fromJS, List } from 'immutable';
+import MenuContent from 'ba-api/menu';
+import {
+ TOGGLE_SIDEBAR,
+ OPEN_SUBMENU,
+ CHANGE_THEME,
+ LOAD_PAGE
+} from 'ba-actions/actionTypes';
+
+const initialState = {
+ sidebarOpen: true,
+ theme: 'purpleRedTheme',
+ pageLoaded: false,
+ palette: List([
+ { name: 'Purple Red', value: 'purpleRedTheme' },
+ { name: 'Natural Green Orange', value: 'greenTheme' },
+ { name: 'Blue Ocean', value: 'blueTheme' },
+ { name: 'Blue Sky', value: 'skyBlueTheme' },
+ { name: 'Sweet Magenta Cyan', value: 'magentaTheme' },
+ { name: 'Violet Green', value: 'purpleTheme' },
+ { name: 'Vintage Yellow', value: 'yellowCyanTheme' },
+ { name: 'Orange Violet', value: 'orangeTheme' },
+ { name: 'Cyan Green', value: 'cyanTheme' },
+ { name: 'Red Silver', value: 'redTheme' },
+ { name: 'Grey', value: 'greyTheme' },
+ { name: 'Green Nature', value: 'greenNatureTheme' },
+ ]),
+ subMenuOpen: []
+};
+
+const getMenus = menuArray => menuArray.map(item => {
+ if (item.child) {
+ return item.child;
+ }
+ return false;
+});
+
+const setNavCollapse = (arr, curRoute) => {
+ let headMenu = 'not found';
+ for (let i = 0; i < arr.length; i += 1) {
+ for (let j = 0; j < arr[i].length; j += 1) {
+ if (arr[i][j].link === curRoute) {
+ headMenu = MenuContent[i].key;
+ }
+ }
+ }
+ return headMenu;
+};
+
+const initialImmutableState = fromJS(initialState);
+
+export default function reducer(state = initialImmutableState, action = {}) {
+ switch (action.type) {
+ case TOGGLE_SIDEBAR:
+ return state.withMutations((mutableState) => {
+ mutableState.set('sidebarOpen', !state.get('sidebarOpen'));
+ });
+ case OPEN_SUBMENU:
+ return state.withMutations((mutableState) => {
+ // Set initial open parent menu
+ const activeParent = setNavCollapse(
+ getMenus(MenuContent),
+ action.initialLocation
+ );
+
+ // Once page loaded will expand the parent menu
+ if (action.initialLocation) {
+ mutableState.set('subMenuOpen', List([activeParent]));
+ return;
+ }
+
+ // Expand / Collapse parent menu
+ const menuList = state.get('subMenuOpen');
+ if (menuList.indexOf(action.key) > -1) {
+ if (action.keyParent) {
+ mutableState.set('subMenuOpen', List([action.keyParent]));
+ } else {
+ mutableState.set('subMenuOpen', List([]));
+ }
+ } else {
+ mutableState.set('subMenuOpen', List([action.key, action.keyParent]));
+ }
+ });
+ case CHANGE_THEME:
+ return state.withMutations((mutableState) => {
+ mutableState.set('theme', action.theme);
+ });
+ case LOAD_PAGE:
+ return state.withMutations((mutableState) => {
+ mutableState.set('pageLoaded', action.isLoaded);
+ });
+ default:
+ return state;
+ }
+}