{"version":3,"sources":["global/orderReceiptDefaults.js","utils/dataFunctions.js","utils/history.js","utils/eventEmitter.js","config.js","store/keycloakReducer.js","store/notificationReducer.js","store/currentTableDataReducer.js","store/tokensReducer.js","store/urlsReducer.js","store/store.js","utils/tokenFunctions.js","authProvider.js","resources.js","orderResources.js","productResources.js","utils/headers.js","dataProviderPreProcess.js","dataProviderPostProcess.js","dataProvider.js","utils/authFunctions.js","routes/Dashboard.js","routes/Login.js","components/FieldDescription.js","components/FieldDivider.js","global/theme.js","global/dialogStyles.js","global/styles.js","components/ContactCreateDialog.js","components/ContactDetailsFromID.js","components/FieldMessage.js","components/AutocompleteSelect.js","components/GetListSelectInput.js","css/images/IconSortArrowDown.js","css/images/IconSortArrowUp.js","components/ListLoading.js","components/ListMessage.js","components/DeleteDialog.js","utils/tableFunctions.js","components/ListTable.js","components/OrderReceiptProductEditDialog.js","components/ProductImage.js","components/ProductDetailDialog.js","components/ProductThumbnail.js","global/tableStyles.js","components/OrderItemsAvailableList.js","global/listColumns.js","components/SelectFromListDialog.js","components/SelectFromListInput.js","components/TitleCreateDialog.js","components/OrgShowSelectFromListInput.js","components/OrderItemsAvailableListContainer.js","components/OrderItemsList.js","utils/apiOrderFunctions.js","routes/OrderCreate.js","routes.js","language/en.js","store/actions.js","store/actionTypes.js","utils/KeycloakHandler.js","components/ParrotAppBar.js","components/Sidebar.js","components/admin/EditActions.js","components/admin/Edit.js","components/admin/ShowActions.js","components/admin/Show.js","components/admin/DataTable.js","routes/Contact.js","components/ListEmpty.js","components/ProductDetailDialogContainer.js","routes/Product.js","routes/Show.js","components/Menu.js","assets/Parrot-Media-Logo-light.png","components/Notification.js","utils/pageFunctions.js","components/Layout.js","components/ContactDetails.js","components/OrderItemListViewContainer.js","global/orderStatus.js","routes/Order.js","routes/Organization.js","routes/NotFound.js","App.js","serviceWorker.js","index.js"],"names":["ORDER_QUERY_DEFAULTS","ORDER_RECEIPT_TABLE_FILTERS","key","clearOnFilterBy","Boolean","window","location","hostname","match","isBlank","term","undefined","addPaginationAndSortToQuery","queryObj","q","page","addAnd","per_page","sort_by","sort_order","addQuickFiltersToQuery","forEach","filter","filter_by","includes","buildOrderListQuery","includeFilters","arguments","length","from","to","generateUUID","dt","Date","getTime","replace","c","r","Math","random","floor","toString","query","padDateString","num","String","slice","setItemDateValues","date","addOffset","date_item","offset","getTimezoneOffset","setTime","date_string","datetime","order","withTime","dateObj","mo","getMonth","dy","getDate","yy","getFullYear","hr","getHours","ampm","dateStr","mn","getMinutes","minVal","isNaN","makeDateString","getDefaultDateRanges","today","lastMonth","months","setMonth","subtractMonths","lastMonthStr","lastDateStr","monthBack","formatDateToUTCWithOffset","toISOString","setDateRangeValues","defaultDateRanges","fromValue","fromDate","fromUTC","fromWithTime","substring","toValue","toDate","setUTCHours","setUTCMinutes","setUTCSeconds","toUTC","toWithTime","assembleDefaultQueryString","resource","p","filter_list_view","filter_status_id","filter_from","filter_to","encodeURIComponent","JSON","stringify","stripWhiteSpace","str","trim","history","createHashHistory","eventEmitter","EventEmitter","Emitter","on","event","fn","once","off","emit","payload","Object","freeze","config","currentTableData","currentList","keycloakState","keycloakAuthenticated","keycloakReady","routes","id","needsAuth","tokensDefault","idToken","token","refreshToken","urls","api_url","keycloakReducer","state","Config","action","type","authenticated","notificationReducer","currentTableDataReducer","tokensReducer","tokens","urlsReducer","initialState","createAdminStore","_ref","authProvider","dataProvider","reducer","combineReducers","admin","adminReducer","router","connectRouter","ordersRetrieved","sagaMiddleware","createSagaMiddleware","composeEnhancers","__REDUX_DEVTOOLS_EXTENSION_COMPOSE__","trace","traceLimit","compose","store","createStore","resettableAppReducer","USER_LOGOUT","applyMiddleware","routerMiddleware","thunk","run","all","adminSaga","map","fork","processKeycloakTokens","authProviderToken","login","Promise","resolve","logout","checkError","status","console","log","reject","checkAuth","props","allowed","route","findIndex","getPermissions","RESOURCES","GET_LIST","params","org_id","filter_org_id","active","localStorage","getItem","GET_ONE","CREATE","UPDATE","company_id","filter_company_id","_pagination$page","_pagination$perPage","_sort$field","_sort$order","filterBy","dateRange","pagination","sort","perPage","field","uri","filter_contact_id","filter_bill_ref_id","filter_id","buildSearchOrderQuery","filter_sku","_params$data$org_id","_params$data","data","encodeURI","filter_title","filter_show_id","filter_product_type_id","filter_parent_product_type_id","sku","image_path","getPostHeaders","useBearer","headers","Authorization","preProcessActiveIdParams","formatPostContactData","modified","notes","formatPostShowData","parseInt","new_org_id","current_org_id","postProcessData","rdata","processGetContactsData","processGetContactData","processGetOrdersData","processGetOrderData","processGetProductsData","processGetProductData","processGetShowData","item","idx","name","first_name","last_name","city","createdOn","ship_to_name","ship_to","created_on_date","created_on_string","created_on","modifiedDate","modified_date","modified_string","required_by_date","required_by_string","required_by","requiredByDate","shipped_on_date","shipped_on_string","shipped_on","shippedOnDate","ids","qty","_item$type_name","type_display_name","type_name","parent_type_name","imageBase","resources","ProductImage","thumbnail","warehouse_locations","push","total","_rdata$data$type_name","_rdata$data","show_id","selected_show_id","current_show_id","resourceMap","Contact","Organization","ProductType","ShippingCompany","ShippingMethod","Show","orderResources","Order","OrderCreate","OrderStart","OrderItem","OrdersByStatus","productResources","Product","ProductById","ProductBySku","ProductsByOrg","ProductsByShow","ProductsByTitle","ProductsByType","getParams","getParrotData","emptyData","interceptLoadData","filterOrdersBy","toLowerCase","filterProductBy","parse","formattedParams","formatGetParams","cfg","axios","method","url","maxBodyLength","Infinity","maxContentLength","then","response","parseParams","hasNameKeys","needsId","parentKey","idKey","setUniqueKeys","objectResponse","getListFromDataObject","list","orders","parseResponse","keys","i","idValue","dataTotal","preProcessSingleListData","title","catch","error","request","sendParrotData","formattedData","formatPostData","message","previousData","responseData","setTimeout","resolveObj","checkAuthentication","keycloakToken","tokenIsExpired","isExpired","tokenValue","tokenExp","jwt_decode","exp","nowDate","withRouter","connect","isAuthenticated","pathname","_jsx","Redirect","defaultOrderQueryString","_Fragment","children","_jsxs","className","Card","Title","CardHeader","CardContent","CardActions","Button","variant","component","Link","concat","redirect","removeItem","fdStyles","display","width","fontSize","color","lineHeight","letterSpacing","verticalAlign","margin","flex","minHeight","fontWeight","height","FieldDescription","styles","style","fieldStyle","marginBottom","description","header","inline","instructions","text","border","backgroundColor","marginTop","FieldDivider","dividerStyle","PTTheme","fontFamily","palette","canvasColor","primary1Color","primary2Color","primary3Color","accent1Color","accent2Color","accent3Color","textColor","alternateTextColor","tableRowAltColor","borderColor","lightTextColor","disabledColor","correctColor","errorColor","toolBarTextColor","overrides","MuiButton","containedPrimary","outlined","padding","MuiCardActions","root","MuiCardContent","MuiCardHeader","MuiFilledInput","MuiFormControl","minWidth","fullWidth","marginDense","MuiTableCell","head","whiteSpace","sizeSmall","useDialogStyles","makeStyles","zIndex","closeButton","position","right","top","useLoadingStyles","textError","PTheme","viewStyles","avatar","textAlign","marginRight","paddingTop","avatarSvg","break","buttonInline","divider","fieldDescription","fieldDescriptionTop","fieldTitle","fieldInput","fieldInstructions","fieldLabel","fieldLink","textDecoration","borderBottom","fieldMultiline","fieldWide","maxWidth","overflow","fieldWrap","filterDescription","filterHalf","filterInline","filterLeft","filterSelectSmall","filterThird","hidden","marginLeft","noMargin","noWrap","noPaddingTop","paddingBottom","rowField","rowShowField","rowShowFieldWide","ContactCreateDialog","openDialog","onCloseFunc","onCompleteFunc","selectedOrgId","success","open","setOpen","useState","submitting","setSubmitting","formMessage","setFormMessage","useEffect","validateForm","values","new_name","handleClose","classes","loadingClasses","Dialog","onClose","transitionDuration","enter","exit","MuiDialogTitle","disableTypography","Typography","IconButton","onClick","CloseIcon","MuiDialogContent","dividers","Form","onSubmit","formValues","_v$new_name","_v$new_first_name","_v$new_last_name","_v$new_address","_v$new_address2","_v$new_city","_v$new_country","_v$new_state","_v$new_zip","_v$new_email","_v$new_phone","_v$new_notes","v","new_first_name","new_last_name","address","new_address","address2","new_address2","new_city","country","new_country","new_state","zip","new_zip","email","new_email","phone","new_phone","new_notes","assembleFormData","errorMessage","mutators","setValue","_ref2","_ref3","value","changeValue","render","_ref4","form","handleSubmit","TextInput","label","source","helperText","formClassName","multiline","disabled","CircularProgress","size","container","fontStyle","ContactDetailsFromID","contact","setContact","contacts","setContacts","loaded","setLoaded","getContacts","useCallback","find","err","finally","Fragment","FieldMessage","AutocompleteSelect","allowEmpty","choices","isRequired","onChange","validate","emptyText","returnValueType","AutocompleteInput","optionText","required","options","placeholder","suggestionsContainerProps","modifiers","computeStyle","enabled","gpuAcceleration","applyStyle","e","handleChange","focusable","viewBox","d","GetListSelectInput","Component","constructor","super","handleOnChange","target","changeFunc","this","onChangeFunc","selectedId","selectChoices","componentDidMount","requiresFilter","displayField","fetchData","getDerivedStateFromProps","nextProps","prevState","componentDidUpdate","prevProps","snapshot","resourceActive","resourceSort","resourceId","resourceFile","resourceName","displayArray","displayType","split","optionTextSeparator","assembleChoiceNames","setState","assembled","choice","separator","display_name","excluded","excludedId","sortObj","arr","sortField","sortOrder","a","b","localeCompare","reverse","sortArrayByKey","defaultProps","addLabel","clearOnMount","IconSortArrowDown","xmlns","IconSortArrowUp","useLoadingContentStyles","loadingContentStyles","ListLoading","contentClasses","Box","m","usePromptStyles","promptContentStyles","ListMessage","actions","btnClose","btnDialog","DefaultColumnFilter","column","filterValue","setFilter","FocusedColumnFilter","isSorted","autoFocus","showButtonColumnObject","Header","Cell","_ref6","row","basePath","ShowButton","record","original","disableFilters","disableSortBy","ListTable","columns","includePagination","listFilters","listFilter","messageEmpty","messageFilter","focusOnLoad","rowStyle","tableHeight","tableList","setTableList","setTableData","tableData","useMemo","tableColumns","pageIndex","pageSize","sortBy","desc","defaultColumn","React","Filter","getTableProps","getTableBodyProps","headerGroups","prepareRow","rows","gotoPage","useTable","useFilters","useSortBy","usePagination","cellProps","tableStyle","headerGroup","getHeaderGroupProps","getHeaderProps","getSortByToggleProps","canSort","isSortedDesc","canFilter","getRowProps","cells","cell","getCellProps","TablePagination","count","rowsPerPage","rowsPerPageOptions","onPageChange","newPage","Number","dialog","btn","btnAdd","btnIcon","btnInfo","btnText","inputCheckbox","inputQty","saving","table","tHead","tBody","tr","trAdded","th","td","tdName","tdSku","OrderReceiptProductEditDialog","product","onSaveFunc","dialogType","productId","setProductId","qtyRequested","setQtyRequested","qty_requested","Table","stickyHeader","TableHead","TableRow","TableCell","align","TableBody","show_name","TextField","handleEditUpdate","_e$target","_value","InputProps","inputProps","max","min","step","CheckCircleRoundedIcon","useStyles","allowUpload","renderType","imageType","substr","indexOf","newImageFile","newImageSrc","thumbnailPath","thumbnailSrc","refresh","useRefresh","responseType","src","URL","createObjectURL","uploadText","handleDelete","deleteImage","product_id","DELETE","DeleteIcon","alt","ImageInput","accept","multiple","minSize","maxSize","ImageField","ProductDetailDialog","setRecord","fetchItem","_response$data$type_n","_response$data","SimpleShowLayout","ProductThumbnail","mounted","useRef","productThumbnail","setProductThumbnail","setSrc","path","thumbPath","ProductImageThumbnail","obj","current","tableStyles","messageError","trEditing","float","thRight","paddingRight","tdRight","OrderItemsAvailableList","onEditFunc","fullItemList","filterName","filterSKU","filterTitleId","filterTypeId","excludeZeroQty","filteredItemList","setFilteredItemList","itemDetailState","setItemDetailState","itemEditState","setItemEditState","filterList","nameFilter","skuFilter","titleId","typeId","add","type_id","accessor","sortType","setRowState","added","_ref5","_ref7","handleInfoClick","InfoIcon","_ref8","_ref9","_ref10","handleEditClick","EditIcon","getRowStyle","handleCloseItemDialog","handleCloseEditDialog","CLIENT_COLUMNS","CONTACT_COLUMNS","PRODUCT_TYPE_COLUMNS","_ref11","_ref12","SHIPPING_COMPANY_COLUMNS","_ref13","SHIPPING_METHOD_COLUMNS","_ref14","TITLE_COLUMNS","_ref15","org_name","_ref16","TITLE_BY_ORG_COLUMNS","_ref17","paper","SelectFromListDialog","itemPlural","listLabel","listSort","onSelectFunc","setColumns","setList","loading","setLoading","filterObject","setFilterObject","setTableColumns","columnArray","selectButtonColumn","selectButtonColumnObject","getItemList","baseResources","handleSelectClick","assembleListObject","_item$id","_item$name","firstLast","tabIndex","SelectFromListInput","fieldValue","hasClear","errorText","inAdminForm","returnType","selectedObject","filterForm","useForm","valueObject","setValueObject","selectNewItem","returnValue","change","endAdornment","InputAdornment","preventDefault","stopPropagation","handleClearSelected","cursor","HighlightOffIcon","handleItemSelected","Field","TitleCreateDialog","new_title_name","_values$new_title_nam","btnStyles","addNewButton","OrgShowSelectFromListInput","handleOrgSelect","selectedShowId","onSelectOrg","handleShowSelect","onSelectShow","handleTitleCreated","selectedShow","displayCreateTitleDialog","createTitleDialogOpen","selectedOrg","showChoicesAll","showChoicesFiltered","updateOrg","updateOrgId","org","orgId","includeTitleCreation","orgLabel","orgSrc","selectOrg","showLabel","showSrc","newTitle","inputClass","orgSource","showSource","OrderItemsAvailableListContainer","orderId","displayFields","onProductAdjust","productToUpdate","refreshList","updateList","currentOrgId","setCurrentOrgId","itemList","setItemList","setFilterName","filterNameValue","setFilterNameValue","setFilterSKU","filterSKUValue","setFilterSKUValue","setFilterTitleId","setFilterTypeId","updateComplete","setUpdateComplete","updateProductComplete","setUpdateProductComplete","fetchItems","processItems","itemToAdd","qty_available","updateProductQty","updateFilterSKU","clearTimeout","updateFilterName","blurFilter","document","activeElement","blur","handleSearchNameSKUFilter","_e$currentTarget$valu","_e$currentTarget","val","currentTarget","handleSelectTitleFilter","handleSelectTypeFilter","alwaysOn","submitted","handleAddChange","OrderItemsList","onEditQtyFunc","onRemoveFunc","hasEditQty","hasRemove","currentItem","setCurrentItem","currentItemId","setCurrentItemId","setQty","availableQty","setAvailableQty","newQty","setNewQty","saveRequest","setSaveRequest","saveMessage","setSaveMessage","handleEditQtyClose","index","handleEditQtyClick","defaultValue","handleEditQtyChange","startIcon","SaveIcon","new_qty","updateAvailable","handleRemoveClick","RemoveCircleOutlineIcon","colSpan","postOrder","onFailure","result","onSuccess","postItem","productToPost","order_id","theme","flexGrow","borderRadius","boxShadow","appBar","borderTopLeftRadius","borderTopRightRadius","itemSelect","tabIndicator","toolbar","justifyContent","alignItems","spacing","breakpoints","up","paddingLeft","down","CreateToolbar","TopToolbar","classnames","ListButton","CreateTitle","getElementById","titleElement","Avatar","OrdersIcon","createPortal","todayValue","orderStartedState","setOrderStartedState","productsAddedState","setProductsAddedState","setOrgState","startedMessageState","setStartedMessageState","productMessageState","setProductMessageState","orderState","setOrderState","complete","tabState","setTab","handleTabChange","newValue","createContactDialogOpen","setCreateContactDialogOpen","refreshContacts","setRefreshContacts","setProductToUpdate","updateProducts","setUpdateProducts","productsSubmitted","setProductsSubmitted","handleFormStep","orderStarted","items","postOrderData","tasks","taskLength","task","assembleProductSubmitData","taskIdx","starterPromise","reduce","spec","itemsIdx","handleSetValueFromSelect","_e$id","_e$id2","handleAddOrRemoveItem","listUpdated","splice","ship_to_id","client_notes","shipped_with","shipping_type","handleCloseCreateContactDialog","_values$items","_values$items2","isDisabled","AppBar","Tabs","indicator","Tab","role","handleContactCreated","customRoutes","Route","exact","LoginPage","Dashboard","customEnglishMessages","ra","add_filter","back","bulk_actions","cancel","clear_input_value","clone","confirm","create","delete","edit","export","remove_filter","remove","save","search","show","undo","unselect","expand","close","open_menu","close_menu","boolean","true","false","null","dashboard","not_found","empty","invite","input","file","upload_several","upload_single","image","references","all_missing","many_missing","single_missing","password","toggle_visible","toggle_hidden","about","are_you_sure","bulk_delete_content","bulk_delete_title","delete_content","delete_title","details","invalid_form","no","yes","unsaved_changes","navigation","no_results","no_more_results","page_out_of_boundaries","page_out_from_end","page_out_from_begin","page_range_info","page_rows_per_page","next","prev","auth","auth_check_error","user_menu","username","sign_in","sign_in_error","notification","updated","created","deleted","bad_item","item_doesnt_exist","http_error","data_provider_error","i18n_error","canceled","logged_out","validation","minLength","maxLength","minValue","maxValue","number","oneOf","regex","pos","configuration","language","light","dark","monthly_revenue","month_history","new_orders","pending_reviews","new_customers","pending_orders","welcome","subtitle","aor_button","demo_button","menu","sales","catalog","customers","fields","commands","first_seen","groups","last_seen","last_seen_gte","total_spent","confirm_password","filters","last_visited","this_week","last_week","this_month","last_month","earlier","has_ordered","has_newsletter","group","fieldGroups","identity","stats","change_password","errors","password_mismatch","amount","basket","delivery","reference","quantity","sum","tax_rate","unit_price","customer_id","date_gte","date_lte","total_gte","returned","invoices","command_id","products","category_id","height_gte","height_lte","price","stock_lte","stock","width_gte","width_lte","tabs","reviews","categories","relative_to_poster","detail","comment","rating","approved_success","approved_error","rejected_success","rejected_error","segments","compulsive","collector","ordered_once","regular","returns","reviewer","logOutUser","tokenTimer","mapDispatchToProps","setKeycloakAuthenticated","setKeycloakReady","setTokens","keycloak","setTokenTimer","setInterval","expired","isTokenExpired","didInitialize","clearInterval","updateToken","loginUserCallback","redirectUri","updateTokenCallback","logoutUserCallback","setKeycloakIsReady","setUserAuthenticated","storeToken","defaults","common","handleUpdate","handleLogin","handleLogout","handleTokenExpired","textOverflow","spacer","ParrotAppBar","userMenu","useSidebarStyles","drawerPaper","ParrotSidebar","Sidebar","EditActions","hasList","hasShow","Edit","ReactAdminEdit","undoable","ShowActions","hasEdit","EditButton","ReactAdminShow","DataTable","manualQuickFilters","manualSortAndPagination","setCurrentTableData","storeForExport","filterValues","setFilters","setPage","setSort","useListContext","dataList","setDataList","currentTableList","setCurrentTableList","manualPageIndex","setManualPageIndex","lastFilterRef","storeCurrentTableData","idLength","manualFilters","manualPagination","manualSortBy","storeCurrentRows","_row$original","isNew","CssBaseline","MaUTable","_createElement","handleManualSort","handleManualQuickFilters","updatedFilters","tdClass","ClassName","toPage","handleManualPagination","ContactIcon","PermContactCalendarIcon","useToolbarStyles","validateName","ListFilter","SelectInput","ListTitle","showButtonColumn","editButtonColumn","listColumns","ContactList","isSmall","useMediaQuery","List","filterDefaultValues","bulkActionButtons","SimpleList","primaryText","secondaryText","tertiaryText","ShowTitle","ContactShow","BooleanField","icon","ContactCreate","Create","SimpleForm","submitOnEnter","EditTitle","EditToolbar","Toolbar","SaveButton","ContactEdit","ListEmpty","paragraph","namePlural","connector","nameSingle","ProductDetailDialogContainer","ProductIcon","CategoryIcon","ProductList","ProductShow","ShowIcon","LocalActivityIcon","ListActions","ExportButton","ShowList","ShowShow","useMenuStyles","inactiveStyle","useButtonStyles","useIconButtonStyles","dividerStyles","collapsed","onMenuClick","isXSmall","useSelector","ui","sidebarOpen","buttonClasses","iconButtonClasses","dividerClass","logoLinkClass","dashboardLinkStyle","MenuItemLink","leftIcon","DashboardIcon","sidebarIsOpen","PersonIcon","useNotificationStyles","warning","ParrotNotification","Notification","autoHideDuration","useLayoutStyles","content","flexWrap","useHistory","useLocation","pushHistory","s","windowLocation","getLocationElements","href","hash","setItem","storedDestination","Layout","sidebar","ParrotMenu","ContactDetails","OrderItemListViewContainer","setSaving","saveError","setSaveError","handleUpdateQty","ORDER_STATUS","OrderIcon","onFilterChange","fName","fValue","updateFilters","fValues","DateInput","rest","displayedFilters","showFilter","sanitizeListRestProps","cloneElement","context","CreateButton","listPagination","OrderList","lc","useListController","fv","clientCol","destinationCol","statusCol","order_status","created_by","OrderShow","controllerProps","useShowController","DateField","OrganizationIcon","BusinessIcon","OrganizationShow","NotFound","i18nProvider","polyglotI18nProvider","englishMessages","allowMissing","createTheme","App","configParams","keycloakInitConfig","dp","assign","createPortalStore","async","init","origin","initKeycloak","onAuthLogout","onAuthRefreshSuccess","onAuthSuccess","onReady","onTokenExpired","setKeycloakEventHandlers","Provider","Admin","layout","ParrotLayout","loginPage","catchAll","disableTelemetry","Resource","KeycloakHandler","unregister","navigator","serviceWorker","ready","registration","auth_client_id","auth_realm","auth_url","fetch","json","getEnvironmentConfig","Keycloak","realm","clientId","enableLogging","onLoad","promiseType","checkLoginIframe","ReactDOM"],"mappings":"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","file":"static/js/main.4d9d0861.chunk.js","sourcesContent":["export const ORDER_QUERY_DEFAULTS = {\n filter_list_view: 'browse',\n filter_by: 'status',\n filter_status_id: 1,\n page: 1,\n per_page: 50,\n sort_by: 'created_on_date',\n sort_order: 'DESC'\n};\n\nexport const ORDER_RECEIPT_TABLE_FILTERS = [\n {key: 's_approved_by', clearOnFilterBy: ['sku']},\n {key: 's_bill_ref_desc', clearOnFilterBy: ['bill_ref','sku']},\n {key: 's_billed_by_name', clearOnFilterBy: ['sku']},\n {key: 's_created_by', clearOnFilterBy: ['sku']},\n {key: 's_id', clearOnFilterBy: ['sku']},\n {key: 's_order_status', clearOnFilterBy: ['status', 'sku']},\n {key: 's_org_name', clearOnFilterBy: ['client', 'contact', 'sku']},\n {key: 's_shipped_with_name', clearOnFilterBy: ['sku']},\n {key: 's_shipping_type_name', clearOnFilterBy: ['sku']},\n {key: 's_tracking_number', clearOnFilterBy: ['sku']},\n {key: 's_ship_to_name', clearOnFilterBy: ['client', 'contact', 'sku']}\n];\n\nexport const ORDER_BROWSE_EXPORT_COLUMNS = [\n {key: 'created_on_string', label: 'Created On'},\n {key: 'required_by_string', label: 'Required By'},\n {key: 'org_name', label: 'Client'},\n {key: 'id', label: 'Order ID'},\n {key: 'order_status', label: 'Status'},\n {key: 'shipped_with_name', label: 'Shipped With'},\n {key: 'shipping_type_name', label: 'Shipping Method'},\n {key: 'ship_to.name', label: 'Destination'},\n {key: 'created_by', label: 'Created By'},\n {key: 'notes', label: 'Notes'}\n];\n","import {ORDER_QUERY_DEFAULTS, ORDER_RECEIPT_TABLE_FILTERS} from '../global/orderReceiptDefaults';\n\n/**\n * Determine if current runtime is local\n *\n * @type {boolean}\n */\nexport const isLocalhost = Boolean(\n window.location.hostname === 'localhost' ||\n window.location.hostname === '[::1]' ||\n window.location.hostname.match(\n /^127(?:\\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}$/\n )\n);\n\n/**\n * Load JSON file with environment variables\n *\n * @return {Promise}\n */\nexport async function getEnvironmentConfig() {\n return fetch('/config.json')\n .then((response) => response.json())\n .then((data) => {\n return Promise.resolve(data);\n })\n .catch(error => {\n return Promise.reject(error);\n });\n}\n\n/**\n * Check for a blank or invalid value\n *\n * @param term\n * @return {boolean}\n */\nexport const isBlank = (term) => {\n return (term === undefined || term === null || term === '');\n};\n\nexport const addPaginationAndSortToQuery = (queryObj) => {\n let q = '';\n if (queryObj.page) {\n q += addAnd(q) + 'page=' + queryObj.page;\n }\n if (queryObj.per_page) {\n q += addAnd(q) + 'per_page=' + queryObj.per_page;\n }\n if (queryObj.sort_by) {\n q += addAnd(q) + 'sort_by=' + queryObj.sort_by;\n }\n if (queryObj.sort_order) {\n q += addAnd(q) + 'sort_order=' + queryObj.sort_order;\n }\n return q;\n};\n\nexport const addQuickFiltersToQuery = (queryObj) => {\n let q = '';\n // Assemble key/value pairs for table quick-filters\n ORDER_RECEIPT_TABLE_FILTERS.forEach((filter) => {\n // If this filter is populated:\n if (queryObj.filter[filter.key]) {\n // Do not include if the Filter By selection overrides it:\n if (queryObj.filter.filter_by && !filter.clearOnFilterBy.includes(queryObj.filter.filter_by)) {\n q += addAnd(q) + filter.key + '=' + queryObj.filter[filter.key];\n }\n }\n });\n return q;\n};\n\nexport const buildSearchOrderQuery = (queryObj) => {\n let q = '?';\n\n // Assemble pagination and sorting\n q += addPaginationAndSortToQuery(queryObj);\n\n // Add Quick-filters\n q += addQuickFiltersToQuery(queryObj);\n\n // Add ID if the table does not already filter it\n if (!q.includes('s_id=')) {\n q += addAnd(q) + 's_id=' + queryObj.filter.filter_id;\n }\n\n return q;\n};\n\n/**\n * Assemble query string for Order List calls\n *\n * @param queryObj\n * @param includeRange\n * @param includeFilters\n * @returns {string}\n */\nexport const buildOrderListQuery = (queryObj, includeRange = false, includeFilters = false) => {\n let q = '?';\n\n if (includeRange) {\n q += 'from=' + queryObj.from + '&to=' + queryObj.to;\n }\n // Assemble pagination and sorting\n q += addPaginationAndSortToQuery(queryObj);\n\n if (includeFilters) {\n q += addQuickFiltersToQuery(queryObj);\n }\n return q;\n};\n\n/**\n * Generate a UUID for payloads and unique keys (per React's unique-key requirement)\n */\nexport const generateUUID = () => {\n let dt = new Date().getTime();\n const uuid = 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) {\n const r = (dt + Math.random() * 16) % 16 | 0;\n dt = Math.floor(dt / 16);\n return (c === 'x' ? r : ((r & 0x3) | 0x8)).toString(16);\n });\n return uuid;\n};\n\n/**\n * Update an object via Object.assign\n *\n * @param oldObject\n * @param newValues\n * @return {any}\n */\nexport const updateObject = (oldObject, newValues) => {\n return Object.assign({}, oldObject, newValues)\n};\n\n/**\n * Copy an array\n *\n * @param array\n * @return {any}\n */\nexport const copyArray = (array) => {\n return JSON.parse(JSON.stringify(array))\n};\n\n/**\n * Combine two items into an array\n *\n * @param arr1\n * @param arr2\n * @return {*[]}\n */\nexport const combineArrays = (arr1, arr2) => {\n return [].concat(arr1, arr2);\n};\n\n/**\n * Convert bytes to a human-readable string\n *\n * @param bytes\n * @return {string}\n */\nexport const convertBytesToString = (bytes) => {\n let i = Math.floor(Math.log(bytes) / Math.log(1024)), sizes = ['B', 'KB', 'MB', 'GB', 'TB', 'PB'];\n return (bytes / Math.pow(1024, i)).toFixed(2) * 1 + ' ' + sizes[i];\n};\n\n/**\n * Sort array of objects alphanumerically\n *\n * @param arr\n * @param sortField\n * @param sortOrder\n */\nexport const sortArrayByKey = (arr, sortField, sortOrder = 'ASC') => {\n arr.sort(function (a, b) {\n return a[sortField].toString().toLowerCase().localeCompare(b[sortField].toString().toLowerCase());\n });\n if (sortOrder === 'DESC') {\n arr = arr.reverse();\n }\n return arr;\n};\n\n/**\n * Sort numbers\n *\n * @param a\n * @param b\n * @param sortOrder\n * @return {number}\n */\nexport const sortNumber = (a, b, sortOrder = 'ASC') => {\n return (sortOrder === 'DESC') ? b - a : a - b;\n};\n\n/**\n * Add commas to numerical strings\n *\n * @param nStr\n * @return {string}\n */\nexport const addCommas = (nStr) => {\n nStr += '';\n let x = nStr.split('.');\n let x1 = x[0];\n let x2 = x.length > 1 ? '.' + x[1] : '';\n let rgx = /(\\d+)(\\d{3})/;\n while (rgx.test(x1)) {\n x1 = x1.replace(rgx, '$1,$2');\n }\n return x1 + x2;\n};\n\n/**\n * Pad numbers less than 10 with a leading zero\n *\n * @param num\n * @return {string}\n */\nexport const addLeadingZero = (num) => {\n return String('00' + num).slice(-2);\n};\n\n/**\n * Determine if a string contains a space\n *\n * @param s\n * @returns {boolean}\n */\nexport const hasSpace = (s) => {\n return (s.indexOf(' ') !== -1 || s.indexOf('%20') !== -1 || s.indexOf('%02') !== -1 || s.indexOf('%03') !== -1);\n};\n\nexport const addAnd = (query) => {\n return (query[query.length - 1] === '?') ? '' : '&';\n};\n\n/**\n * Convert an incoming value to a currency for editing\n *\n * @param value\n * @return {{cents: number, dollars: number}}\n */\nexport const processToCurrency = (value) => {\n const currencyValue = (value && value !== '') ? toCurrency(value) : toCurrency(0);\n const arr = currencyValue.split('.');\n return {\n dollars: parseInt(arr[0], 10),\n cents: parseInt(arr[1], 10),\n value: currencyValue\n };\n};\n\n/**\n * Convert value to number with two decimal places\n *\n * @param value\n * @param fromPennies\n * @return {string}\n */\nexport const toCurrency = (value, fromPennies = false) => {\n let valueToConvert = value;\n if (fromPennies) {\n valueToConvert = value * 0.01;\n }\n return addCommas(parseFloat(valueToConvert).toFixed(2));\n};\n\n/**\n * Format a datetime string from a Date object\n * @param date\n * @return {string}\n */\nexport const createDateTimeString = (date) => {\n // Format: YYYY-MM-DDTHH:MM:SSZ\n const dateObj = (date) ? date : new Date();\n return dateObj.getFullYear() + '-'\n + padDateString(dateObj.getMonth() + 1) + '-'\n + padDateString(dateObj.getDate()) + 'T'\n + padDateString(dateObj.getHours()) + ':'\n + padDateString(dateObj.getMinutes()) + ':'\n + padDateString(dateObj.getSeconds()) + 'Z';\n};\n\n/**\n * Assemble a human-readable date string\n *\n * @param datetime\n * @param order\n * @param withTime\n * @return {string}\n */\nexport const makeDateString = (datetime, order = 'm', withTime = true) => {\n const dateObj = new Date(datetime);\n const mo = dateObj.getMonth() + 1;\n const dy = dateObj.getDate();\n const yy = dateObj.getFullYear();\n let hr = dateObj.getHours();\n const ampm = (hr > 11) ? 'PM' : 'AM';\n if (hr === 0) {\n hr = 12;\n }\n if (hr > 12) {\n hr -= 12;\n }\n let mn = dateObj.getMinutes();\n let minVal = String('00' + mn).slice(-2);\n let dateStr;\n if (order === 'm') {\n dateStr = mo + '/' + dy + '/' + yy;\n } else if (order === 'd') {\n dateStr = dy + '/' + mo + '/' + yy;\n } else {\n dateStr = mo + '/' + dy + '/' + yy;\n }\n if (withTime) {\n dateStr += ', ' + hr + ':' + minVal + ' ' + ampm;\n }\n if (isNaN(yy) || isNaN(mo)) {\n dateStr = 'No Date';\n }\n return dateStr;\n};\n\n/**\n * Pad numbers less than 10 with a leading zero\n *\n * @param num\n * @return {string}\n */\nexport const padDateString = (num) => {\n return String('00' + num).slice(-2);\n};\n\n/**\n * Create additional values from a timestamp for rendering in tables or fields\n *\n * @param date\n * @param addOffset\n * @return {{date_item: Date, date_string: string}}\n */\nexport const setItemDateValues = (date, addOffset = false) => {\n const date_item = new Date(date);\n if (addOffset) {\n const offset = date_item.getTimezoneOffset() * 60000;\n date_item.setTime(date_item.getTime() + offset);\n }\n const date_string = makeDateString(date_item.toString(), 'm', true);\n return {\n date_item: date_item,\n date_string: date_string\n }\n};\n\n/**\n * Return a date moved forward by time zone offset\n *\n * @param date\n * @returns {*}\n */\nexport const subtractTimeZoneOffset = (date) => {\n const offset = date.getTimezoneOffset() * 60000;\n date.setTime(date.getTime() - offset);\n return date;\n};\n\n/**\n * Return a date moved backward by time zone offset\n *\n * @param date\n * @returns {*}\n */\nexport const addTimeZoneOffset = (date) => {\n const offset = date.getTimezoneOffset() * 60000;\n date.setTime(date.getTime() + offset);\n return date;\n};\n\nexport const subtractMonths = (date, months) => {\n date.setMonth(date.getMonth() - months);\n return date;\n}\n\nexport const getDefaultDateRanges = () => {\n const today = new Date();\n const lastMonth = subtractMonths(new Date(), 1);\n const to = today.getFullYear() + '-' + padDateString(today.getMonth() + 1) + '-' + padDateString(today.getDate());\n let lastMonthStr = padDateString(lastMonth.getMonth() + 1);\n let lastDateStr = padDateString(lastMonth.getDate());\n if (lastMonthStr === '02' && lastDateStr === '29') {\n lastDateStr = '28';\n }\n let monthBack = lastMonth.getFullYear() + '-' + lastMonthStr + '-' + lastDateStr;\n return {\n from: '2016-01-01',\n to: to.toString(),\n monthBack: monthBack\n };\n};\n\nexport const formatDateToUTCWithOffset = (date) => {\n const offset = date.getTimezoneOffset();\n const utcDate = new Date(date.getTime() + offset * 60000);\n return utcDate.toISOString();\n};\n\nexport const setDateRangeValues = (from, to) => {\n const defaultDateRanges = getDefaultDateRanges();\n\n // Set from request to UTC date + time zone offset\n const fromValue = (from) ? from : defaultDateRanges.from;\n const fromDate = new Date(fromValue);\n const fromUTC = formatDateToUTCWithOffset(fromDate);\n const fromWithTime = fromUTC.substring(0, 10) + ' ' + fromUTC.substring(11, 19);\n\n // Set to request to end of UTC date + time zone offset\n const toValue = (to) ? to : defaultDateRanges.to;\n const toDate = new Date(toValue);\n toDate.setUTCHours(23);\n toDate.setUTCMinutes(59);\n toDate.setUTCSeconds(59);\n const toUTC = formatDateToUTCWithOffset(toDate);\n const toWithTime = toUTC.substring(0, 10) + ' ' + toUTC.substring(11, 19);\n \n return {\n from: fromValue,\n fromWithTime: fromWithTime,\n to: toValue,\n toWithTime: toWithTime\n };\n};\n\nexport const assembleDefaultQueryString = (resource) => {\n const defaultDateRanges = getDefaultDateRanges();\n let p = {\n filter: {},\n };\n if (resource === 'Order') {\n p.filter.filter_list_view = ORDER_QUERY_DEFAULTS.filter_list_view;\n p.filter.filter_by = ORDER_QUERY_DEFAULTS.filter_by;\n p.filter.filter_status_id = ORDER_QUERY_DEFAULTS.filter_status_id;\n p.filter.filter_from = defaultDateRanges.monthBack;\n p.filter.filter_to = defaultDateRanges.to;\n p.per_page = ORDER_QUERY_DEFAULTS.per_page;\n p.sort_by = ORDER_QUERY_DEFAULTS.sort_by;\n p.sort_order = ORDER_QUERY_DEFAULTS.sort_order;\n }\n const encodedFilter = encodeURIComponent(JSON.stringify(p.filter));\n return '?filter=' + encodedFilter + '&page=1&per_page=' + p.per_page + '&sort=' + p.sort_by + '&order=' + p.sort_order;\n};\n\nexport const processProductTypeList = (list, type) => {\n if (type === 'parent') {\n // Return only Product Categories without a parent Category\n return list.filter(item => (item.parent_type_id === null || item.parent_type_id === undefined || item.parent_type_id === ''));\n }\n if (type === 'child') {\n // Return only Product Categories with a parent Category\n return list.filter(item => (item.parent_type_id && item.parent_type_id > 0));\n }\n return list;\n};\n\nexport const stripWhiteSpace = (str) => {\n if (!str) {\n return str;\n }\n return str.replace(/\\s\\s+/g, ' ').trim();\n};\n","import {createHashHistory} from 'history';\n\nexport const history = createHashHistory();\n","import EventEmitter from 'eventemitter3';\n\nconst eventEmitter = new EventEmitter();\n\nconst Emitter = {\n on: (event, fn) => eventEmitter.on(event, fn),\n once: (event, fn) => eventEmitter.once(event, fn),\n off: (event, fn) => eventEmitter.off(event, fn),\n emit: (event, payload) => eventEmitter.emit(event, payload)\n}\n\nObject.freeze(Emitter);\n\nexport default Emitter;\n","const config = {\n currentTableData: {\n currentList: []\n },\n keycloakState: {\n keycloakAuthenticated: false,\n keycloakReady: false\n },\n routes: [\n {id: 'dashboard', needsAuth: false}\n ],\n tokensDefault: {\n idToken: null,\n token: null,\n refreshToken: null\n },\n urls: {\n api_url: ''\n }\n};\n\nexport default config;\n","import Config from '../config';\n\nconst keycloakReducer = (state = Config.keycloakState, action) => {\n if (action.type === 'SET_KEYCLOAK_AUTHENTICATED') {\n return {\n ...state,\n keycloakAuthenticated: action.authenticated\n }\n }\n if (action.type === 'SET_KEYCLOAK_READY') {\n return {\n ...state,\n keycloakReady: true\n }\n }\n return state;\n};\n\nexport default keycloakReducer;\n","const notificationReducer = (state = false, action) => {\n if (action.type === 'SET_ORDERS_RETRIEVED') {\n return true\n }\n return state;\n};\n\nexport default notificationReducer;","import Config from '../config';\n\nconst currentTableDataReducer = (state = Config.currentTableData, action) => {\n return {\n ...state,\n currentList: (action.currentList) ? action.currentList : state.currentList\n };\n};\n\nexport default currentTableDataReducer;","import Config from '../config';\n\nconst tokensReducer = (state = Config.tokensDefault, action) => {\n if (action.type === 'SET_TOKENS') {\n return {\n ...state,\n token: action.tokens.token\n }\n }\n return state;\n};\n\nexport default tokensReducer;","import Config from '../config';\n\nconst urlsReducer = (state = Config.urls, action) => {\n return {\n ...state,\n urls: action.urls\n };\n};\n\nexport default urlsReducer;","import {applyMiddleware, combineReducers, compose, createStore} from 'redux';\nimport {routerMiddleware, connectRouter} from 'connected-react-router';\nimport createSagaMiddleware from 'redux-saga';\nimport {all, fork} from 'redux-saga/effects';\nimport thunk from 'redux-thunk';\nimport {\n adminReducer,\n adminSaga,\n USER_LOGOUT\n} from 'react-admin';\nimport keycloakReducer from './keycloakReducer';\nimport notificationReducer from './notificationReducer';\nimport currentTableDataReducer from './currentTableDataReducer';\nimport tokensReducer from './tokensReducer';\nimport urlsReducer from './urlsReducer';\nimport Config from '../config';\n\nconst initialState = {\n currentTableData: Config.currentTableData,\n keycloakState: Config.keycloakState,\n tokens: Config.tokensDefault,\n urls: Config.urls\n};\n\nconst createAdminStore = ({\n authProvider,\n dataProvider,\n history\n }) => {\n\n // Combine all reducers (React-Admin, Parrot)\n const reducer = combineReducers({\n admin: adminReducer,\n router: connectRouter(history),\n tokens: tokensReducer,\n keycloakState: keycloakReducer,\n ordersRetrieved: notificationReducer,\n urls: urlsReducer,\n currentTableData: currentTableDataReducer\n });\n const resettableAppReducer = (state, action) =>\n reducer(action.type !== USER_LOGOUT ? state : undefined, action);\n\n // Combine sagas (React-Admin)\n const saga = function* rootSaga() {\n yield all(\n [\n adminSaga(dataProvider, authProvider),\n // Add sagas\n ].map(fork)\n );\n };\n const sagaMiddleware = createSagaMiddleware();\n\n // Add enhancers for Redux\n const composeEnhancers =\n (window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__ && window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__({\n trace: true,\n traceLimit: 25,\n })) ||\n compose;\n\n const store = createStore(\n resettableAppReducer,\n initialState,\n composeEnhancers(\n applyMiddleware(\n sagaMiddleware,\n routerMiddleware(history),\n thunk\n )\n ),\n );\n sagaMiddleware.run(saga);\n\n return store;\n};\n\nexport default createAdminStore;\n","import jwt_decode from 'jwt-decode';\nimport Emitter from './eventEmitter';\n\n/**\n * Decode a JWT token and return its payload\n *\n * @param token\n * @return {any | undefined}\n */\nexport const decodeToken = (token) => {\n return jwt_decode(token);\n};\n\n/**\n * Store tokens from initial login\n *\n * @param token\n * @param idToken\n * @param refreshToken\n */\nexport const processKeycloakTokens = (token, idToken, refreshToken) => {\n if (token || refreshToken) {\n const tokens = {\n token: token,\n idToken: idToken,\n refreshToken: refreshToken\n };\n // Notify subscribers of received token\n Emitter.emit('accessToken', tokens.token);\n }\n};\n\n/**\n * Check if a token's expiration has passed\n *\n * @param exp\n * @return {boolean}\n */\nexport const isKeycloakTokenExpired = (exp) => {\n let nowDate = new Date();\n let expDate = new Date((exp * 1000));\n return (expDate - nowDate) <= 0;\n};\n\n/**\n * Extract User information from token\n *\n * @param token\n * @return {{email_verified: (*|string), name: (*|string), preferred_username: (*|string), given_name: (*|string), family_name: (*|string), email: (*|string)}|null}\n */\nexport const getUserInfoFromToken = (token) => {\n const dt = decodeToken(token);\n if (dt) {\n return {\n email: (dt && dt.email) ? dt.email : '',\n email_verified: (dt && dt.email_verified) ? dt.email_verified : '',\n family_name: (dt && dt.family_name) ? dt.family_name : '',\n given_name: (dt && dt.given_name) ? dt.given_name : '',\n name: (dt && dt.name) ? dt.name : '',\n preferred_username: (dt && dt.preferred_username) ? dt.preferred_username : ''\n };\n }\n return null;\n};\n\n/**\n * Determine if logged-in user is a sysop\n *\n * @param token\n * @returns {boolean}\n */\nexport const isSysop = (token) => {\n const dt = decodeToken(token);\n if (dt) {\n const roles = dt.realm_access?.roles;\n if (roles && roles.findIndex(r => r === 'sysop') !== -1) {\n return true;\n }\n }\n return false;\n};\n\n/**\n * Determine if logged-in user is a sysop or a Parrot Admin\n *\n * @param token\n * @returns {boolean}\n */\nexport const isSysopOrAdmin = (token) => {\n const dt = decodeToken(token);\n if (dt) {\n const roles = dt.realm_access?.roles;\n if (roles && roles.findIndex(r => r === 'sysop') !== -1) {\n return true;\n }\n if (roles && roles.findIndex(r => r === 'parrot_admin') !== -1) {\n return true;\n }\n }\n return false;\n};\n\n/**\n * Return a role from Realm Access for permissions\n *\n * @param token\n * @returns {string}\n */\nexport const getRole = (token) => {\n const dt = decodeToken(token);\n if (dt) {\n const roles = dt.realm_access?.roles ?? [];\n if (roles.findIndex(r => r === 'sysop') !== -1) {\n return 'sysop';\n }\n if (roles.findIndex(r => r === 'representative') !== -1) {\n return 'representative';\n }\n if (roles.findIndex(r => r === 'warehouse') !== -1) {\n return 'warehouse';\n }\n }\n return '';\n};\n","let authProviderToken = null;\n\n/**\n * Store token for use with this provider\n *\n * @param token\n */\nexport function setAuthProviderToken(token) {\n if (authProviderToken !== token) {\n authProviderToken = token;\n }\n}\n\nconst authProvider = {\n // Called when user attempts to log in (unused)\n login: () => {\n return Promise.resolve();\n },\n\n // Called when user clicks on RA logout button (unused)\n logout: () => {\n return Promise.resolve();\n },\n\n // Called when API returns an error\n checkError: ({status}) => {\n console.log('authProvider checkError: ', status);\n if (!authProviderToken || status === 401 || status === 403 || status === 'missing required token') {\n return Promise.reject();\n }\n return Promise.resolve();\n },\n\n // Called when user navigates to a new location, to check for authentication\n checkAuth: (props) => {\n // console.log('authProvider checkAuth: ', props);\n // return Promise.resolve();\n const openRoutes = [\n 'dashboard'\n ];\n const allowed = (props.route && (openRoutes.findIndex(r => r === props.route) !== -1));\n return (authProviderToken || allowed)\n ? Promise.resolve()\n : Promise.reject();\n },\n\n // Called when the user navigates to a new location, to check for permissions / roles\n getPermissions: () => {\n // console.log('authProvider getPermissions');\n // return Promise.resolve('test');\n return (authProviderToken)\n ? Promise.resolve()\n : Promise.reject();\n },\n};\n\nexport default authProvider;","/**\n * Resources for API\n * Contact\n * Organization\n * Product Category (Type)\n * Shipping Company\n * Shipping Method\n * Show\n */\n\nexport const RESOURCES = {\n 'Contact': {\n GET_LIST: function (params) {\n let org_id = (params && params.params.filter.filter_org_id) ? params.params.filter.filter_org_id : null;\n let active = (params.active) ? params.active : false;\n return {\n 'method': 'GET',\n 'title': 'Contacts',\n 'uri': localStorage.getItem('server') + '/api/v1/mgmt/contacts/' + org_id + '/' + active\n };\n },\n GET_ONE: function (params) {\n return {\n 'method': 'GET',\n 'uri': localStorage.getItem('server') + '/api/v1/mgmt/contact/' + params.id\n };\n },\n CREATE: function (params) {\n return {\n 'method': 'POST',\n 'data': params,\n 'uri': localStorage.getItem('server') + '/api/v1/mgmt/contact/create'\n };\n },\n UPDATE: function (params) {\n return {\n 'method': 'POST',\n 'data': params,\n 'uri': localStorage.getItem('server') + '/api/v1/mgmt/contact/update'\n };\n }\n },\n 'Organization': {\n GET_LIST: function (params) {\n let active = (params.active) ? params.active : false;\n return {\n 'method': 'GET',\n 'title': 'Clients',\n 'uri': localStorage.getItem('server') + '/api/v1/mgmt/organizations/' + active\n };\n },\n GET_ONE: function (params) {\n return {\n 'method': 'GET',\n 'uri': localStorage.getItem('server') + '/api/v1/mgmt/organization/' + params.id\n };\n },\n UPDATE: function (params) {\n return {\n 'method': 'POST',\n 'data': params,\n 'uri': localStorage.getItem('server') + '/api/v1/mgmt/organization/update'\n };\n }\n },\n 'ProductType': {\n GET_LIST: function (params) {\n let active = (params.active) ? params.active : false;\n return {\n 'method': 'GET',\n 'title': 'Product Types',\n 'uri': localStorage.getItem('server') + '/api/v1/mgmt/productTypes/' + active\n };\n }\n },\n 'ShippingCompany': {\n GET_LIST: function (params) {\n let active = (params.active) ? params.active : false;\n return {\n 'method': 'GET',\n 'title': 'Shipping Companies',\n 'uri': localStorage.getItem('server') + '/api/v1/mgmt/shipping/companies/' + active\n };\n }\n },\n 'ShippingMethod': {\n GET_LIST: function (params) {\n let company_id = (params && params.params.filter.filter_company_id) ? params.params.filter.filter_company_id : null;\n let active = (params.active) ? params.active : false;\n return {\n 'method': 'GET',\n 'title': 'Shipping Methods',\n 'uri': localStorage.getItem('server') + '/api/v1/mgmt/shipping/types/' + company_id + '/' + active\n };\n }\n },\n 'Show': {\n GET_LIST: function (params) {\n let active = (params && params.active) ? params.active : false;\n return {\n 'method': 'GET',\n 'title': 'Titles',\n 'uri': localStorage.getItem('server') + '/api/v1/mgmt/shows/' + active\n };\n },\n GET_ONE: function (params) {\n return {\n 'method': 'GET',\n 'uri': localStorage.getItem('server') + '/api/v1/mgmt/show/' + params.id\n };\n }\n },\n 'ShowByOrg': {\n GET_LIST: function (params) {\n let org_id = (params && params.org_id) ? params.org_id : null;\n let active = (params && params.active) ? params.active : false;\n return {\n 'method': 'GET',\n 'title': 'Titles',\n 'uri': localStorage.getItem('server') + '/api/v1/mgmt/all/shows/' + org_id + '/' + active\n };\n }\n }\n};\n\nexport default (type, resource, params) => {\n\n /**\n * @param {string} type Request type, e.g. GET_LIST\n * @param {string} resource Resource name, e.g. \"Organization\"\n * @param {Object} payload Request parameters. Depends on request type\n * @returns {Object} RESOURCES object\n */\n return (type, resource, params) => {\n return RESOURCES;\n };\n}\n","import {buildOrderListQuery, buildSearchOrderQuery, setDateRangeValues} from './utils/dataFunctions';\nimport {ORDER_QUERY_DEFAULTS} from './global/orderReceiptDefaults';\n\n/**\n * Product Order Resources for API\n * Order:\n * Get List by Filter\n * Get One\n * Update\n * Order: Start (initialize)\n * Order: Item(s)\n * Get List by Order\n * Get One\n * Add One\n * Update Qty\n * Order: Create (finish)\n * Orders by Organization\n * Orders by Status\n */\n\nexport const RESOURCES = {\n 'Order': {\n GET_LIST: function (params) {\n const filter = params.params.filter;\n const filterBy = params.params.filter.filter_by;\n const dateRange = setDateRangeValues(filter.filter_from, filter.filter_to);\n const pagination = params.params.pagination;\n const sort = params.params.sort;\n const queryObj = {\n page: pagination?.page ?? ORDER_QUERY_DEFAULTS.page,\n per_page: pagination?.perPage ?? ORDER_QUERY_DEFAULTS.per_page,\n sort_by: sort?.field ?? ORDER_QUERY_DEFAULTS.sort_by,\n sort_order: sort?.order ?? ORDER_QUERY_DEFAULTS.sort_order,\n filter: filter\n };\n let query = buildOrderListQuery(queryObj, false, true);\n let uri;\n\n if (filterBy === 'contact' && filter.filter_contact_id && dateRange.fromWithTime && dateRange.toWithTime) {\n // Get Orders by Contact ID (requires Client and Date Range)\n uri = '/api/v1/mgmt/orders/contact/' + filter.filter_contact_id + '/' + dateRange.fromWithTime + '/' + dateRange.toWithTime + query;\n\n } else if (\n (filterBy === 'contact' && filter.filter_org_id && !filter.filter_contact_id) ||\n (filterBy === 'client' && filter.filter_org_id)\n ) {\n // Get Orders by Organization ID (if by Client or by Client + Contact; includes Date Range)\n uri = '/api/v1/mgmt/orders/allByOrg/' + filter.filter_org_id + '/' + dateRange.fromWithTime + '/' + dateRange.toWithTime + query;\n\n } else if (filterBy === 'bill_ref' && filter.filter_bill_ref_id) {\n // Get Orders by selected Billing Reference ID\n uri = '/api/v1/mgmt/orders/billRef/' + filter.filter_bill_ref_id + query;\n\n } else if (filterBy === 'date_range' && dateRange.fromWithTime && dateRange.toWithTime) {\n // Get all Orders by Date Range\n queryObj.from = dateRange.fromWithTime;\n queryObj.to = dateRange.toWithTime;\n query = buildOrderListQuery(queryObj, true, true);\n uri = '/api/v1/mgmt/orders/all' + query;\n\n } else if (filterBy === 'id' && filter.filter_id) {\n // Get Orders by selected Order ID\n query = buildSearchOrderQuery(queryObj);\n uri = '/api/v1/mgmt/orders/all' + query;\n\n } else if (filterBy === 'sku' && filter.filter_sku) {\n // Get Orders by selected Product SKU\n uri = '/api/v1/mgmt/orders/sku/' + filter.filter_sku + query;\n\n } else if (filterBy === 'status' && filter.filter_status_id && dateRange.fromWithTime && dateRange.toWithTime) {\n // Get Orders by selected Status ID and Date Range\n uri = '/api/v1/mgmt/orders/status/' + filter.filter_status_id + '/' + dateRange.fromWithTime + '/' + dateRange.toWithTime + query;\n }\n return {\n 'method': 'GET',\n 'title': 'Orders',\n 'uri': localStorage.getItem('server') + uri\n }\n },\n GET_ONE: function (params) {\n return {\n 'method': 'GET',\n 'uri': localStorage.getItem('server') + '/api/v1/mgmt/order/' + params.id\n }\n }\n },\n 'OrderStart': {\n CREATE: function (params) {\n let id = params?.data?.org_id ?? null;\n return {\n 'method': 'PUT',\n 'uri': localStorage.getItem('server') + '/api/v1/mgmt/order/start/' + id\n }\n }\n },\n 'OrderItem': {\n GET_LIST: function (params) {\n let id = (params && params.id) ? params.id : null;\n return {\n 'method': 'GET',\n 'title': 'Order Items',\n 'uri': localStorage.getItem('server') + '/api/v1/mgmt/orderItems/' + id\n }\n },\n GET_ONE: function (params) {\n let id = (params && params.id) ? params.id : null;\n return {\n 'method': 'GET',\n 'uri': localStorage.getItem('server') + '/api/v1/mgmt/orderItem/' + id\n }\n },\n CREATE: function (params) {\n return {\n 'method': 'POST',\n \"data\": params.data,\n 'uri': localStorage.getItem('server') + '/api/v1/mgmt/orderItem/add'\n }\n },\n UPDATE: function (params) {\n return {\n 'method': 'POST',\n \"data\": params.data,\n 'uri': localStorage.getItem('server') + '/api/v1/mgmt/orderItem/update'\n }\n }\n },\n 'OrderCreate': {\n CREATE: function (params) {\n return {\n 'method': 'POST',\n \"data\": params.data,\n 'uri': localStorage.getItem('server') + '/api/v1/mgmt/order/create'\n }\n }\n },\n 'OrdersByStatus': {\n GET_LIST: function (params) {\n let status = (params && params.status) ? params.status : null;\n const dateRange = setDateRangeValues(params.from, params.to);\n const queryObj = {\n page: 1,\n per_page: 10000,\n sort_by: ORDER_QUERY_DEFAULTS.sort_by,\n sort_order: ORDER_QUERY_DEFAULTS.sort_order\n };\n let query = buildOrderListQuery(queryObj, false, false);\n return {\n 'method': 'GET',\n 'title': 'Orders',\n 'uri': localStorage.getItem('server') + '/api/v1/mgmt/orders/status/' + status + '/' + dateRange.fromWithTime + '/' + dateRange.toWithTime + query\n }\n }\n },\n};\n\nexport default (type, resource, params) => {\n\n /**\n * @param {string} type Request type, e.g. GET_LIST\n * @param {string} resource Resource name, e.g. \"OrderStart\"\n * @param {Object} payload Request parameters. Depends on request type\n * @returns {Object} RESOURCES object\n */\n return (type, resource, params) => {\n return RESOURCES;\n }\n}\n","/**\n * Product Resources for API\n * Product List by Filter\n * Product by ID, SKU\n * Product Image\n * Products by Column\n */\n\nexport const RESOURCES = {\n 'Product': {\n GET_LIST: function (params) {\n let active = (params.active) ? params.active : false;\n const filter = params.params.filter;\n const filterBy = params.params.filter.filter_by;\n let uri;\n if (filter.filter_sku) {\n // Search Product by search term (SKU)\n uri = '/api/v1/mgmt/search/productsBySku/' + encodeURI(filter.filter_sku);\n } else if (filter.filter_title) {\n // Search Products by search term (Title)\n uri = '/api/v1/mgmt/productsByTitle/' + encodeURI(filter.filter_title) + '/' + active;\n } else if (filterBy === 'client' && filter.filter_org_id) {\n // Get Products by selected Client (Organization) ID\n uri = '/api/v1/mgmt/productsByOrg/' + filter.filter_org_id + '/' + active;\n } else if (filterBy === 'show' && filter.filter_show_id) {\n // Get Products by selected Title (Show) ID\n uri = '/api/v1/mgmt/productsByShow/' + filter.filter_show_id + '/' + active;\n } else if (filterBy === 'product_type' && filter.filter_product_type_id) {\n // Get Products by selected Product Category (Type) ID\n uri = '/api/v1/mgmt/productsByType/' + filter.filter_product_type_id + '/' + active;\n } else if (filterBy === 'product_type' && filter.filter_parent_product_type_id) {\n // Get Products by selected parent Product Category (Type) ID\n uri = '/api/v1/mgmt/productsByType/' + filter.filter_parent_product_type_id + '/' + active;\n } else {\n uri = '/api/v1/mgmt/products/' + active;\n }\n return {\n 'method': 'GET',\n 'uri': localStorage.getItem('server') + uri\n }\n },\n GET_ONE: function (params) {\n return {\n 'method': 'GET',\n 'title': 'Products',\n 'uri': localStorage.getItem('server') + '/api/v1/mgmt/product/id/' + params.id\n }\n }\n },\n 'Products': {\n GET_LIST: function (params) {\n let active = (params.active) ? params.active : false;\n return {\n 'method': 'GET',\n 'title': 'Products',\n 'uri': localStorage.getItem('server') + '/api/v1/mgmt/products/' + active\n }\n }\n },\n 'ProductById': {\n GET_ONE: function (params) {\n return {\n 'method': 'GET',\n 'title': 'Products',\n 'uri': localStorage.getItem('server') + '/api/v1/mgmt/product/id/' + params.id\n }\n }\n },\n 'ProductBySku': {\n GET_ONE: function (params) {\n return {\n 'method': 'GET',\n 'title': 'Products',\n 'uri': localStorage.getItem('server') + '/api/v1/mgmt/product/sku/' + params.sku\n }\n }\n },\n 'ProductImage': {\n GET_ONE: function (params) {\n return {\n 'method': 'GET',\n 'uri': localStorage.getItem('server') + '/api/v1/mgmt' + params.image_path\n }\n }\n },\n 'ProductImageThumbnail': {\n GET_ONE: function (params) {\n return {\n 'method': 'GET',\n 'uri': localStorage.getItem('server') + '/api/v1/mgmt' + params.image_path\n }\n }\n },\n 'ProductsByOrg': {\n GET_LIST: function (params) {\n let active = (params.active) ? params.active : false;\n let id = (params && params.id) ? params.id : null;\n return {\n 'method': 'GET',\n 'title': 'Products',\n 'uri': localStorage.getItem('server') + '/api/v1/mgmt/productsByOrg/' + id + '/' + active\n }\n }\n },\n 'ProductsByShow': {\n GET_LIST: function (params) {\n let active = (params.active) ? params.active : false;\n let id = (params && params.id) ? params.id : null;\n return {\n 'method': 'GET',\n 'title': 'Products',\n 'uri': localStorage.getItem('server') + '/api/v1/mgmt/productsByShow/' + id + '/' + active\n }\n }\n },\n 'ProductsByTitle': {\n GET_LIST: function (params) {\n let active = (params.active) ? params.active : false;\n return {\n 'method': 'GET',\n 'title': 'Products',\n 'uri': localStorage.getItem('server') + '/api/v1/mgmt/productsByTitle/' + active\n }\n }\n },\n 'ProductsByType': {\n GET_LIST: function (params) {\n let active = (params.active) ? params.active : false;\n let id = (params && params.id) ? params.id : null;\n return {\n 'method': 'GET',\n 'title': 'Products',\n 'uri': localStorage.getItem('server') + '/api/v1/mgmt/productsByType/' + id + '/' + active\n }\n }\n }\n};\n\nexport default (type, resource, params) => {\n\n /**\n * @param {string} type Request type, e.g. GET_LIST\n * @param {string} resource Resource name, e.g. \"ProductsByType\"\n * @param {Object} payload Request parameters. Depends on request type\n * @returns {Object} RESOURCES object\n */\n return (type, resource, params) => {\n return RESOURCES;\n }\n}\n","\n/**\n * Create POST headers\n *\n * @return Object\n */\nexport const getAuthHeaders = () => {\n return {\n 'Cache-Control': 'no-cache',\n 'Content-Type': 'application/json'\n };\n};\n\n/**\n * Create POST headers using access or refresh token\n *\n * @param useBearer\n * @return {{\"Cache-Control\": string, \"Content-Type\": string}}\n */\nexport const getPostHeaders = (useBearer) => {\n const headers = {\n 'Cache-Control': 'no-cache',\n 'Content-Type': 'application/x-www-form-urlencoded'\n };\n if (useBearer === false) {\n headers.Authorization = undefined;\n }\n return headers;\n};\n\n/**\n * Create POST headers using access or refresh token\n *\n * @return {{\"Cache-Control\": string, \"Content-Type\": string}}\n */\nexport const getUploadPostHeaders = () => {\n return {\n 'Accept': '*/*',\n 'Cache-Control': 'no-cache',\n 'Content-Type': 'application/x-www-form-urlencoded',\n 'X-Requested-With': 'XMLHttpRequest'\n };\n};\n\n/**\n * Create GET headers\n *\n * @return Object\n */\nexport const getGetHeaders = () => {\n\n return {\n 'Cache-Control': 'no-cache',\n 'Content-Type': 'application/json',\n };\n};\n\n/**\n * Create DELETE headers using access or refresh token\n *\n * @param useBearer\n * @return {{\"Cache-Control\": string, \"Content-Type\": string}}\n */\nexport const getDeleteHeaders = (useBearer) => {\n const headers = {\n 'Cache-Control': 'no-cache',\n 'Content-Type': 'application/x-www-form-urlencoded'\n };\n if (useBearer === false) {\n headers.Authorization = undefined;\n }\n return headers;\n};\n","import {\n isBlank\n} from './utils/dataFunctions';\n\n/**\n * Intercept resources that attempt to load data before a filter value is available\n *\n * @param resource\n * @param type\n * @param params\n *\n * @return boolean\n */\nexport const interceptLoadData = (type, resource, params) => {\n const filter = params.filter;\n if (resource === 'Contact' && type === 'GET_LIST') {\n if (isBlank(filter.filter_org_id)) {\n return true;\n }\n }\n if (resource === 'Order' && type === 'GET_LIST') {\n const filterOrdersBy = filter.filter_by;\n if (\n isBlank(filterOrdersBy) ||\n (filterOrdersBy === 'client' && isBlank(filter.filter_org_id)) ||\n (filterOrdersBy === 'contact' && (isBlank(filter.filter_org_id) || isBlank(filter.filter_contact_id))) ||\n (filterOrdersBy === 'date_range' && (isBlank(filter.filter_from) || isBlank(filter.filter_to))) ||\n (filterOrdersBy === 'id' && (isBlank(filter.filter_id) || filter.filter_id.length < 3 )) ||\n (filterOrdersBy === 'sku' && (isBlank(filter.filter_sku) || filter.filter_sku.length < 12 )) ||\n (filterOrdersBy === 'status' && isBlank(filter.filter_status_id) && (isBlank(filter.filter_from) || isBlank(filter.filter_to)))\n ) {\n return true;\n }\n }\n if (resource === 'Product' && type === 'GET_LIST') {\n if (\n (!isBlank(filter.filter_title) && filter.filter_title.length > 2)\n ) {\n // Allow title search\n return false;\n }\n if (!isBlank(filter.filter_sku)) {\n let sku = filter.filter_sku.toLowerCase().replace('sku-n', '').replace('sku-', '');\n if (sku.length < 6) {\n return true;\n } else {\n return false;\n }\n }\n const filterProductBy = filter.filter_by;\n if (\n isBlank(filterProductBy) ||\n (filterProductBy === 'client' && isBlank(filter.filter_org_id)) ||\n (filterProductBy === 'product_type' && isBlank(filter.filter_product_type_id)) ||\n (filterProductBy === 'show' && isBlank(filter.filter_show_id))\n ) {\n return true;\n }\n }\n if (resource === 'ShippingMethod' && type === 'GET_LIST') {\n if (isBlank(filter.filter_company_id)) {\n return true;\n }\n }\n return false;\n};\n\n/**\n * Modify format of params before a GET call\n *\n * @param type\n * @param resource\n * @param params\n * @return {{active: *, id: *, params: *}}\n */\nexport const formatGetParams = (type, resource, params) => {\n if (type === 'GET_LIST') {\n if (\n resource === 'Contact' ||\n resource === 'Order' ||\n resource === 'Organization' ||\n resource === 'Show' ||\n resource === 'ShippingCompany' ||\n resource === 'ShippingMethod' ||\n resource === 'ParentProductType' ||\n resource === 'ProductType' ||\n resource === 'Product'\n ) {\n params = preProcessActiveIdParams(params);\n }\n }\n if (\n (resource === 'ProductsByOrg') ||\n (resource === 'ProductsByShow') ||\n (resource === 'ProductsByTitle') ||\n (resource === 'ProductsByType')\n ) {\n params = preProcessActiveIdParams(params);\n }\n return params;\n};\n\n/**\n * Format parameters and query string before a GET call\n *\n * @param params\n * @return {{active: *, id: *, params: *}}\n */\nconst preProcessActiveIdParams = (params) => {\n let active = params.filter.active;\n let id = params.filter.id;\n delete params.filter.active;\n delete params.filter.id;\n\n return {\n active: active,\n id: id,\n params: params\n };\n};\n\n/**\n * Modify or format data before a POST call\n *\n * @param type\n * @param resource\n * @param data\n * @return {*}\n */\nexport const formatPostData = (type, resource, data) => {\n if (resource === 'Contact') {\n data = formatPostContactData(type, data);\n }\n if (resource === 'Show') {\n data = formatPostShowData(type, data);\n }\n return data;\n};\n\n/* Processing for Specific Resources ::::: */\n\nconst formatPostContactData = (type, data) => {\n delete data.modified;\n delete data.notes;\n\n return data;\n};\n\nconst formatPostShowData = (type, data) => {\n if (data.id) {\n data.id = parseInt(data.id, 10);\n }\n if (data.new_org_id) {\n data.org_id = parseInt(data.new_org_id, 10);\n }\n delete data.current_org_id;\n delete data.new_org_id;\n\n return data;\n};\n","import {setItemDateValues, stripWhiteSpace} from './utils/dataFunctions';\nimport {RESOURCES as resources} from './productResources';\n\n/**\n * Pre-process incoming single item data consisting of an array\n *\n * @param resource\n * @param type\n * @param params\n * @param rdata\n * @returns {{location: null, locations: *[], id: null}}\n */\nexport const preProcessSingleListData = (resource, type, params, rdata) => {\n return rdata;\n};\n\n/**\n * Post-Process incoming list or item data\n *\n * @param resource\n * @param type\n * @param params\n * @param rdata\n *\n * @return {*}\n */\nexport const postProcessData = (resource, type, params, rdata) => {\n\n if (resource === 'Contact') {\n if (type === 'GET_LIST') {\n rdata = processGetContactsData(rdata);\n }\n if (type === 'GET_ONE') {\n rdata = processGetContactData(rdata);\n }\n }\n if (resource === 'Order') {\n if (type === 'GET_LIST') {\n rdata = processGetOrdersData(rdata);\n }\n if (type === 'GET_ONE') {\n rdata = processGetOrderData(rdata);\n }\n }\n if (resource === 'Product') {\n if (type === 'GET_LIST') {\n rdata = processGetProductsData(rdata);\n }\n if (type === 'GET_ONE') {\n rdata = processGetProductData(rdata);\n }\n }\n if (resource === 'Show' && type === 'GET_ONE') {\n rdata = processGetShowData(rdata);\n }\n return rdata;\n};\n\n/* ID and Key exported functions ::::: */\n\n/**\n * Mark resources without ids or with different unique identifiers\n */\nexport const setUniqueKeys = (resource) => {\n const parseParams = {\n hasNameKeys: false,\n needsId: false,\n parentKey: null,\n idKey: null,\n };\n if (resource === 'ProductBySku') {\n parseParams.idKey = 'sku';\n }\n return parseParams;\n};\n\n/**\n * Convert GET_ALL responses that are formatted as an object with totals\n */\nexport const getListFromDataObject = (resource, type, rdata) => {\n if (resource === 'Order' && type === 'GET_LIST') {\n return {\n list: (rdata.orders && rdata.orders.length > 0) ? rdata.orders : [],\n total: rdata.total\n }\n }\n return {\n list: rdata,\n total: rdata.length\n }\n};\n\n/* Processing for Specific Resources ::::: */\n\nconst processGetContactsData = (rdata) => {\n if (!rdata.data || !rdata.data.length) {\n return rdata;\n }\n // Remove extra spaces from Contact fields\n rdata.data.forEach(function (item, idx) {\n item.name = stripWhiteSpace(item.name);\n item.first_name = stripWhiteSpace(item.first_name);\n item.last_name = stripWhiteSpace(item.last_name);\n item.city = stripWhiteSpace(item.city);\n if (item.name === '') {\n item.name = item.first_name + ' ' + item.last_name;\n }\n if (item.notes) {\n delete item.notes;\n }\n });\n return rdata;\n};\n\nconst processGetContactData = (rdata) => {\n if (rdata.data.notes) {\n delete rdata.data.notes;\n }\n return rdata;\n};\n\nconst processGetOrdersData = (rdata) => {\n if (!rdata.data || !rdata.data.length) {\n return rdata;\n }\n // Convert Modified Date values to readable string\n rdata.data.forEach(function (item, idx) {\n item.ship_to_name = (item.ship_to.name) ? item.ship_to.name : '';\n\n item.created_on_date = '';\n item.created_on_string = '';\n let createdOn;\n if (item.created_on) {\n createdOn = setItemDateValues(item.created_on);\n item.created_on_date = createdOn.date_item;\n item.created_on_string = createdOn.date_string;\n } else if (item.modified) {\n createdOn = setItemDateValues(item.modified);\n item.created_on_date = createdOn.date_item;\n item.created_on_string = createdOn.date_string;\n }\n if (item.modified) {\n const modifiedDate = setItemDateValues(item.modified);\n item.modified_date = modifiedDate.date_item;\n item.modified_string = modifiedDate.date_string;\n }\n item.required_by_date = '';\n item.required_by_string = '';\n if (item.required_by) {\n const requiredByDate = setItemDateValues(item.required_by);\n item.required_by_date = requiredByDate.date_item;\n item.required_by_string = requiredByDate.date_string;\n }\n item.shipped_on_date = '';\n item.shipped_on_string = '';\n if (item.shipped_on) {\n const shippedOnDate = setItemDateValues(item.shipped_on);\n item.shipped_on_date = shippedOnDate.date_item;\n item.shipped_on_string = shippedOnDate.date_string;\n }\n });\n return rdata;\n};\n\nconst processGetOrderData = (rdata) => {\n // Convert Modified Date values to readable string\n rdata.data.created_on_date = '';\n rdata.data.created_on_string = '';\n if (rdata.data.created_on) {\n const createdOn = setItemDateValues(rdata.data.created_on);\n rdata.data.created_on_date = createdOn.date_item;\n rdata.data.created_on_string = createdOn.date_string;\n }\n if (rdata.data.modified) {\n const modifiedDate = setItemDateValues(rdata.data.modified);\n rdata.data.modified_date = modifiedDate.date_item;\n rdata.data.modified_string = modifiedDate.date_string;\n }\n rdata.data.required_by_date = '';\n rdata.data.required_by_string = '';\n if (rdata.data.required_by) {\n const requiredByDate = setItemDateValues(rdata.data.required_by);\n rdata.data.required_by_date = requiredByDate.date_item;\n rdata.data.required_by_string = requiredByDate.date_string;\n }\n rdata.data.shipped_on_date = '';\n rdata.data.shipped_on_string = '';\n if (rdata.data.shipped_on) {\n const shippedOnDate = setItemDateValues(rdata.data.shipped_on);\n rdata.data.shipped_on_date = shippedOnDate.date_item;\n rdata.data.shipped_on_string = shippedOnDate.date_string;\n }\n\n return rdata;\n};\n\nconst processGetProductsData = (rdata) => {\n if (!rdata.data || !rdata.data.length) {\n return rdata;\n }\n let ids = [];\n let data = [];\n rdata.data.forEach(function (item, idx) {\n // Portal excludes 0-qty Products from visual display\n if (item.qty > 0) {\n // Add Display Categories\n let type_display_name = item?.type_name ?? '';\n if (item.parent_type_name && item.type_name) {\n type_display_name = item.parent_type_name + ' > ' + type_display_name;\n }\n item.type_display_name = type_display_name;\n\n // Get Image path\n\n const imageBase = resources.ProductImage.GET_ONE({image_path: item.thumbnail});\n item.image_path = (item.thumbnail && item.thumbnail !== '') ? imageBase.uri : null;\n\n // Convert date values to readable strings\n if (item.modified) {\n const modifiedDate = setItemDateValues(item.modified);\n item.modified_date = modifiedDate.date_item;\n item.modified_string = modifiedDate.date_string;\n }\n delete item.warehouse_locations;\n\n ids.push(item.id);\n data.push(item);\n }\n });\n rdata.ids = [...ids];\n rdata.data = [...data];\n rdata.total = data.length;\n return rdata;\n};\n\nconst processGetProductData = (rdata) => {\n let type_display_name = rdata.data?.type_name ?? '';\n if (rdata.data.parent_type_name && rdata.data.type_name) {\n type_display_name = rdata.data.parent_type_name + ' > ' + type_display_name;\n }\n rdata.data.type_display_name = type_display_name;\n if (rdata.data.show_id) {\n rdata.data.selected_show_id = rdata.data.show_id;\n rdata.data.current_show_id = rdata.data.show_id;\n }\n delete rdata.data.warehouse_locations;\n return rdata;\n};\n\nconst processGetShowData = (rdata) => {\n if (rdata.data.org_id) {\n rdata.data.current_org_id = rdata.data.org_id;\n }\n return rdata;\n};\n","import axios from 'axios';\nimport {RESOURCES as resources} from './resources';\nimport {RESOURCES as orderResources} from './orderResources';\nimport {RESOURCES as productResources} from './productResources';\nimport {getGetHeaders, getPostHeaders} from './utils/headers';\nimport {formatGetParams, formatPostData, interceptLoadData} from './dataProviderPreProcess';\nimport {getListFromDataObject, preProcessSingleListData, postProcessData, setUniqueKeys} from './dataProviderPostProcess';\nimport {generateUUID} from './utils/dataFunctions';\n\nconst resourceMap = {\n \"Contact\": resources.Contact,\n \"Organization\": resources.Organization,\n \"ProductType\": resources.ProductType,\n \"ShippingCompany\": resources.ShippingCompany,\n \"ShippingMethod\": resources.ShippingMethod,\n \"Show\": resources.Show,\n\n \"Order\": orderResources.Order,\n \"OrderCreate\": orderResources.OrderCreate,\n \"OrderStart\": orderResources.OrderStart,\n \"OrderItem\": orderResources.OrderItem,\n \"OrdersByStatus\": orderResources.OrdersByStatus,\n\n \"Product\": productResources.Product,\n \"ProductById\": productResources.ProductById,\n \"ProductBySku\": productResources.ProductBySku,\n \"ProductsByOrg\": productResources.ProductsByOrg,\n \"ProductsByShow\": productResources.ProductsByShow,\n \"ProductsByTitle\": productResources.ProductsByTitle,\n \"ProductsByType\": productResources.ProductsByType\n};\n\n/**\n * Parse data for Get or Post returns for React-Admin use\n */\nconst parseResponse = (resource, type, rdata, total, parseParams, params) => {\n // console.log('parseResponse rdata: ', rdata);\n\n let data = rdata;\n if (!data) {\n return;\n }\n\n // Get List\n if (type === 'GET_LIST') {\n let keys = [];\n\n for (let i = 0; i < data.length; i++) {\n if (parseParams && parseParams.hasNameKeys) {\n // Resources with \"name\" as unique key\n keys.push(data[i].name);\n data[i].id = data[i].name;\n } else if (parseParams && parseParams.needsId) {\n // Resources that require a unique ID\n data[i].id = generateUUID();\n keys.push(data[i].id);\n } else if (parseParams && parseParams.idKey) {\n // Resources with a unique key that is not \"id\"\n let idValue = null;\n if (parseParams.parentKey) {\n idValue = data[i][parseParams.parentKey][parseParams.idKey];\n } else {\n idValue = data[i][parseParams.idKey];\n }\n keys.push(idValue);\n data[i].id = idValue;\n } else {\n keys.push(data[i].id);\n }\n }\n\n let dataTotal = (total) ? total : rdata.length;\n if (!dataTotal) {\n dataTotal = 0;\n }\n\n return {\n \"data\": data,\n \"ids\": keys,\n \"total\": dataTotal\n }\n }\n\n // Get One: Return either first element in data array or data\n if (type === 'GET_ONE') {\n // Process any single item comprised of an array\n data = preProcessSingleListData(resource, type, params, rdata);\n\n if (parseParams && parseParams.needsId) {\n // If the Resource needs a generated ID:\n const id = generateUUID();\n if (data[0]) {\n data[0].id = id;\n } else {\n data.id = id;\n }\n }\n if (parseParams && parseParams.idKey) {\n // If the Resource has a unique key to use as the ID:\n if (data[0]) {\n if (parseParams.parentKey) {\n data[0].id = data[0][parseParams.parentKey][parseParams.idKey];\n } else {\n data[0].id = data[0][parseParams.idKey];\n }\n } else {\n if (parseParams.parentKey) {\n data.id = data[parseParams.parentKey][parseParams.idKey];\n } else {\n data.id = data[parseParams.idKey];\n }\n }\n }\n return data[0] ? {\"data\": data[0]} : {\"data\": data};\n }\n\n // Create and Edit: Return data\n if (type === 'CREATE' || type === 'UPDATE') {\n return data;\n }\n\n // Delete: Return data\n if (type === 'DELETE') {\n return data;\n }\n\n return {\"data\": {}}\n};\n\nconst getParams = {\n resource: '',\n params: {}\n};\n\nconst getParrotData = (type, resource, params, resolve, reject) => {\n // console.log('getParrotData ', type, resource, params);\n // If request lacks data and should not automatically get data, resolve as empty\n const emptyData = {data: [{id: '', name: ''}], ids: [''], total: 0};\n if (interceptLoadData(type, resource, params)) {\n resolve(emptyData);\n return;\n }\n\n // If request is repeated, return\n if (\n type === 'GET_LIST' &&\n resource === getParams.resource &&\n JSON.stringify(params) === JSON.stringify(getParams.params)\n ) {\n return;\n }\n // Store the previous call\n getParams.resource = resource;\n getParams.params = JSON.parse(JSON.stringify(params));\n\n const formattedParams = formatGetParams(type, resource, params);\n\n let cfg = resourceMap[resource][type](formattedParams);\n let rdata;\n\n return axios({\n method: cfg.method,\n url: cfg.uri,\n headers: getGetHeaders(),\n maxBodyLength: Infinity,\n maxContentLength: Infinity\n }).then((response) => {\n\n if (type === 'GET_LIST' && !response.data) {\n resolve(emptyData);\n }\n if (response.data) {\n // Mark resources with no ids or variable unique identifiers\n const parseParams = setUniqueKeys(resource);\n\n // If the response is an object, convert it and extract the array and total\n let objectResponse = getListFromDataObject(resource, type, response.data);\n\n // Parse the response\n rdata = parseResponse(resource, type, objectResponse.list, objectResponse.total, parseParams, params);\n\n // If no payload is available, display an error\n if (!rdata || (rdata.data && typeof rdata.data !== 'object')) {\n reject('No ' + cfg.title + ' found.');\n return;\n }\n\n // Post-process data for specific resources\n rdata = postProcessData(resource, type, params, rdata);\n if (type === 'GET_LIST' && (!rdata.ids.length || !rdata.data.length)) {\n resolve(emptyData);\n } else {\n resolve(rdata);\n }\n }\n resolve(response);\n }).catch((error) => {\n console.log('getParrotData error for ' + resource + ': ', error);\n if (error.response) {\n // Server response outside 2xx\n reject(error.response.data);\n } else if (error.request) {\n // No response\n reject(error.request);\n }\n reject(error);\n });\n};\n\nconst sendParrotData = (type, resource, params, resolve, reject) => {\n\n const formattedData = formatPostData(type, resource, params.data);\n let cfg = resourceMap[resource][type](formattedData);\n\n // console.log('sendParrotData data ', formattedData);\n // console.log('sendParrotData cfg ', cfg);\n // return;\n\n return axios({\n method: cfg.method,\n url: cfg.uri,\n data: formattedData,\n headers: getPostHeaders(true)\n }).then((response) => {\n if (!response) {\n reject('Data Error');\n } else {\n if (response.error) {\n reject('Data Error: ' + response.message);\n }\n\n // If no data key is available:\n if (!params.data && params.previousData) {\n params.data = params.previousData;\n }\n // Create now requires an ID\n if (type === 'CREATE' && !params.data.id) {\n params.data.id = 1;\n }\n\n const responseData = (response.data) ? response.data : response;\n\n setTimeout(function () {\n let resolveObj = {\n 'data': params.data,\n 'response': responseData\n };\n resolve(resolveObj);\n }, 600);\n }\n }).catch((error) => {\n console.log('sendParrotData error response for ' + resource + ': ', error);\n if (error.response) {\n // Server response outside 2xx\n reject(error.response.data);\n } else if (error.request) {\n // No response\n reject(error.request);\n }\n reject(error);\n });\n};\n\nconst dataProvider = (type, resource, params) => {\n if (type === 'GET_LIST' || type === 'GET_ONE' || type === 'GET_MANY' || type === 'GET_MANY_REFERENCE') {\n return new Promise((resolve, reject) => {\n getParrotData(type, resource, params, resolve, reject);\n return true;\n })\n }\n if (type === 'CREATE' || type === 'UPDATE' || type === 'DELETE' || type === 'POST_GET_LIST') {\n return new Promise((resolve, reject) => {\n sendParrotData(type, resource, params, resolve, reject);\n return true;\n })\n }\n};\n\nexport default dataProvider;\n","import jwt_decode from 'jwt-decode';\n\n/**\n * Return authentication status from stored token or Keycloak values\n *\n * @param keycloakToken\n * @param keycloakAuthenticated\n * @param storedToken\n * @param useStoredToken\n * @return {boolean}\n */\nexport const checkAuthentication = (keycloakToken, keycloakAuthenticated, storedToken = null, useStoredToken = true) => {\n let keycloakTokenExists = (keycloakToken !== undefined && keycloakToken !== null);\n\n // Check that Keycloak has an authenticated value and a token value:\n if (keycloakTokenExists && keycloakAuthenticated !== undefined) {\n if (tokenIsExpired(keycloakToken)) {\n return false;\n }\n\n // Return Keycloak's authenticated value\n return (keycloakAuthenticated);\n }\n\n return false;\n};\n\n/**\n * Determine if a token is expired from its exp value\n *\n * @param token\n */\nexport const tokenIsExpired = (token) => {\n let isExpired = false;\n const tokenValue = (token !== null) ? token : null;\n if (tokenValue) {\n // Decode the token and extract its expiration timestamp\n const decodedToken = jwt_decode(tokenValue);\n const tokenExp = decodedToken.exp;\n\n let nowDate = new Date();\n let expDate = new Date((tokenExp * 1000));\n isExpired = ((expDate - nowDate) <= 0);\n }\n return isExpired;\n};\n\n/**\n * Determine if user has role\n *\n * @param token\n * @param type\n * @param role\n * @return {boolean}\n */\nexport const hasRole = (token, type, role) => {\n const tokenValue = (token !== null) ? token : null;\n if (tokenValue) {\n const decodedToken = jwt_decode(tokenValue);\n let roles;\n let idx;\n if (type === 'realm') {\n roles = decodedToken.realm_access.roles;\n }\n if (type === 'resource') {\n roles = decodedToken.resource_access.account.roles;\n }\n idx = roles.findIndex(r => r === role);\n if (idx !== -1) {\n return true;\n }\n }\n return false;\n};\n","import * as React from \"react\";\nimport {\n Link,\n Redirect,\n withRouter\n} from 'react-router-dom';\nimport {connect} from 'react-redux';\nimport {Title} from 'react-admin';\nimport {checkAuthentication} from '../utils/authFunctions';\nimport {assembleDefaultQueryString} from '../utils/dataFunctions';\nimport Button from '@material-ui/core/Button';\nimport Card from '@material-ui/core/Card';\nimport CardActions from '@material-ui/core/CardActions';\nimport CardContent from '@material-ui/core/CardContent';\nimport CardHeader from '@material-ui/core/CardHeader';\n\nconst Dashboard = ({keycloakReady, keycloakAuthenticated, tokens, location}) => {\n\n let isAuthenticated = checkAuthentication(tokens.token, keycloakAuthenticated);\n\n // If route has a query string, redirect\n if (isAuthenticated && location.pathname !== '/') {\n return \n }\n\n const defaultOrderQueryString = assembleDefaultQueryString('Order');\n\n return (\n <>\n {keycloakReady && isAuthenticated &&\n <>\n
\n \n \n <CardHeader title=\"Welcome to the Parrot Communications Inventory\"/>\n <CardContent>\n <p>Add and manage your Titles and Contacts, and create Orders.</p>\n </CardContent>\n </Card>\n </div>\n\n <div className=\"list-card-container\">\n <Card className=\"list-card half\">\n <CardHeader title=\"Products\"/>\n <CardContent>\n <p>View your Products.</p>\n </CardContent>\n <CardActions>\n <Button variant=\"outlined\" component={Link} to=\"/Product\">\n Browse Products\n </Button>\n </CardActions>\n </Card>\n\n <Card className=\"list-card half last\">\n <CardHeader title=\"Orders\"/>\n <CardContent>\n <p>View and create Orders.</p>\n </CardContent>\n <CardActions>\n <Button variant=\"outlined\" component={Link} to={`/Order${defaultOrderQueryString}`}>\n Browse Orders\n </Button>\n <Button variant=\"outlined\" component={Link} to=\"/Order/create\">\n Add an Order\n </Button>\n </CardActions>\n </Card>\n </div>\n\n <div className=\"list-card-container\">\n <Card className=\"list-card half\">\n <CardHeader title=\"Titles\"/>\n <CardContent>\n <p>View Titles (Shows, Events, Properties, other entities).</p>\n </CardContent>\n <CardActions>\n <Button variant=\"outlined\" component={Link} to=\"/Show\">\n Browse your Titles\n </Button>\n </CardActions>\n </Card>\n\n <Card className=\"list-card half last\">\n <CardHeader title=\"Contacts\"/>\n <CardContent>\n <p>View, create and manage Client Contacts.</p>\n </CardContent>\n <CardActions>\n <Button variant=\"outlined\" component={Link} to=\"/Contact\">\n Browse Contacts\n </Button>\n <Button variant=\"outlined\" component={Link} to=\"/Contact/create\">\n Add a Contact\n </Button>\n </CardActions>\n </Card>\n </div>\n </>\n }\n </>\n )\n};\n\nconst mapStateToProps = (state) => {\n return {\n keycloakAuthenticated: state.keycloakState.keycloakAuthenticated,\n keycloakReady: state.keycloakState.keycloakReady,\n tokens: {\n token: state.tokens.token\n }\n };\n};\n\nexport default withRouter(\n connect(\n mapStateToProps,\n {}\n )(Dashboard)\n);\n","import * as React from 'react';\nimport {\n Redirect,\n withRouter\n} from 'react-router-dom';\nimport {connect} from 'react-redux';\nimport {checkAuthentication} from '../utils/authFunctions';\n\n/**\n * Login Page\n *\n * @param keycloakReady\n * @param keycloakAuthenticated\n * @param tokens\n * @return {*}\n * @constructor\n */\nconst LoginPage = ({keycloakReady, keycloakAuthenticated, tokens}) => {\n\n let isAuthenticated = checkAuthentication(tokens.token, keycloakAuthenticated);\n if (keycloakReady && isAuthenticated && tokens.token) {\n // If Login route loads due to a refresh, check stored destination\n const destination = localStorage.getItem('destination');\n const redirect = destination || '/';\n localStorage.removeItem('destination');\n return <Redirect to={redirect}/>\n }\n\n return (\n <>\n </>\n );\n};\n\nconst mapStateToProps = (state) => {\n return {\n keycloakAuthenticated: state.keycloakState.keycloakAuthenticated,\n keycloakReady: state.keycloakState.keycloakReady,\n tokens: {\n token: state.tokens.token\n }\n };\n};\n\nexport default withRouter(\n connect(\n mapStateToProps,\n {}\n )(LoginPage)\n);\n","import React from 'react';\n\nexport const fdStyles = {\n field: {\n display: 'block',\n width: 'auto',\n fontSize: '14px',\n color: '#524b50',\n lineHeight: '1.4',\n letterSpacing: '0.015em',\n verticalAlign: 'bottom',\n margin: 0\n },\n description: {\n flex: '1 1 40%',\n display: 'inline-block',\n minHeight: '2em',\n fontSize: '12px',\n },\n header: {\n fontSize: '16px',\n fontWeight: 600,\n },\n inline: {\n display: 'inline-block',\n fontSize: '14px',\n fontWeight: '500',\n lineHeight: '46px',\n verticalAlign: 'middle',\n margin: '0 1em 0 0',\n },\n inlineInput: {\n height: 75\n },\n instructions: {\n fontWeight: 600,\n },\n marginBottom: {\n margin: '0 0 1em 0',\n }\n};\n\n/**\n * React-Final-Form capable container for text content\n *\n * @param props\n * @return {*}\n * @constructor\n */\nconst FieldDescription = (props) => {\n\n const styles = (props.style) ? props.style : {};\n\n let fieldStyle = {...fdStyles.field, ...styles};\n if (props.marginBottom) {\n fieldStyle = {...fdStyles.field, ...fdStyles.marginBottom, ...styles};\n }\n if (props.description) {\n fieldStyle = (props.marginBottom)\n ? {...fdStyles.field, ...fdStyles.description, ...fdStyles.marginBottom, ...styles}\n : {...fdStyles.field, ...fdStyles.description, ...styles};\n }\n if (props.header) {\n fieldStyle = (props.marginBottom)\n ? {...fdStyles.field, ...fdStyles.header, ...fdStyles.marginBottom, ...styles}\n : {...fdStyles.field, ...fdStyles.header, ...styles};\n }\n if (props.inline) {\n fieldStyle = (props.type === 'input')\n ? {...fdStyles.field, ...fdStyles.inline, ...fdStyles.inlineInput, ...styles}\n : {...fdStyles.field, ...fdStyles.inline, ...styles};\n }\n if (props.instructions) {\n fieldStyle = (props.marginBottom)\n ? {...fdStyles.field, ...fdStyles.instructions, ...fdStyles.marginBottom, ...styles}\n : {...fdStyles.field, ...fdStyles.instructions, ...styles};\n }\n\n return (\n <span style={fieldStyle}>\n {props.text &&\n <>\n {props.text}\n </>\n }\n </span>\n )\n};\n\nexport default FieldDescription;\n","import React from 'react';\n\nexport const fdStyles = {\n break: {display: 'block', width: '100%', height: 0, border: 'none', margin: 0},\n divider: {\n display: 'block',\n width: '100%',\n height: 1,\n backgroundColor: '#2d5033',\n border: 'none',\n margin: '1em 0 0.5em 0'\n },\n marginBottom: {marginBottom: '1em'},\n marginTop: {marginTop: '1em'},\n};\n\n/**\n * React-Final-Form capable container for divider content\n *\n * @param props\n * @return {*}\n * @constructor\n */\nconst FieldDivider = (props) => {\n\n let dividerStyle = fdStyles.break;\n if (props.type === 'break') {\n dividerStyle = fdStyles.break;\n if (props.margin === 'bottom') {\n dividerStyle = {...fdStyles.break, ...fdStyles.marginBottom};\n }\n if (props.margin === 'top') {\n dividerStyle = {...fdStyles.break, ...fdStyles.marginTop};\n }\n if (props.margin === 'top-bottom') {\n dividerStyle = {...fdStyles.break, ...fdStyles.marginTop, ...fdStyles.marginBottom};\n }\n }\n if (props.type === 'divider') {\n dividerStyle = fdStyles.divider;\n if (props.margin === 'bottom') {\n dividerStyle = {...fdStyles.divider, ...fdStyles.marginBottom};\n }\n if (props.margin === 'top') {\n dividerStyle = {...fdStyles.divider, ...fdStyles.marginTop};\n }\n if (props.margin === 'top-bottom') {\n dividerStyle = {...fdStyles.divider, ...fdStyles.marginTop, ...fdStyles.marginBottom};\n }\n }\n\n return (\n <hr style={dividerStyle}/>\n )\n};\n\nexport default FieldDivider;\n","const PTTheme = {\n fontFamily: 'Roboto, Helvetica, Arial, sans-serif',\n palette: {\n canvasColor: '#ffffff',\n primary1Color: '#3a4242',\n primary2Color: '#3a4242',\n primary3Color: '#147800',\n accent1Color: '#3a4242',\n accent2Color: '#f5f5f5',\n accent3Color: '#9e9e9e',\n textColor: '#212121',\n alternateTextColor: '#ffffff',\n tableRowAltColor: '#fafafa',\n borderColor: '#e0e0e0',\n lightTextColor: 'rgba(33,33,33,0.5)', // #212121\n disabledColor: 'rgba(33,33,33,0.3)', // #212121\n correctColor: '#66bb6a',\n errorColor: '#b4212d',\n toolBarTextColor: '#3f51b5'\n },\n overrides: {\n MuiButton: {\n containedPrimary: {\n backgroundColor: '#508242'\n },\n outlined: {\n padding: '4px 14px'\n }\n },\n MuiCardActions: {\n root: {\n padding: '2px 10px 1px 12px'\n }\n },\n MuiCardContent: {\n root: {\n padding: '10px 14px 8px 14px'\n }\n },\n MuiCardHeader: {\n root: {\n padding: '10px 14px 6px 14px'\n }\n },\n MuiFilledInput: {\n root: {\n backgroundColor: 'rgba(240, 242, 241, 0.9)',\n '&:hover': {\n backgroundColor: 'rgba(0, 0, 0, 0.1)',\n }\n }\n },\n MuiFormControl: {\n root: {\n width: '100%',\n minWidth: 90,\n '&.third-width': {\n minWidth: '33%'\n },\n '&.half-width': {\n minWidth: '50%'\n },\n '&.full-width': {\n width: '100%'\n }\n },\n fullWidth: {\n width: 'calc(100% - 1em)'\n },\n marginDense: {\n marginTop: 0\n }\n },\n MuiTableCell: {\n head: {\n whiteSpace: 'nowrap'\n },\n sizeSmall: {\n lineHeight: '1.3',\n padding: '6px 16px 5px 14px',\n verticalAlign: 'middle'\n }\n }\n }\n};\n\nexport default PTTheme;\n","import PTheme from './theme';\nimport {makeStyles} from '@material-ui/core/styles';\n\nexport const useDialogStyles = makeStyles({\n root: {\n zIndex: '2 !important'\n },\n title: {\n margin: 0,\n padding: 12,\n },\n closeButton: {\n position: 'absolute',\n right: 10,\n top: 8,\n color: '#666666',\n }\n});\n\nexport const useLoadingStyles = makeStyles({\n root: {\n display: 'inline-block',\n fontWeight: 500,\n margin: '0 0.5em',\n verticalAlign: 'bottom'\n },\n text: {\n display: 'inline-block',\n fontSize: 16,\n fontWeight: 500,\n letterSpacing: '0.015em',\n margin: '5px 0.5em 0 0.5em',\n verticalAlign: 'middle'\n },\n textError: {\n display: 'inline-block',\n fontSize: 16,\n fontWeight: 500,\n color: PTheme.palette.errorColor,\n letterSpacing: '0.015em',\n margin: '5px 0.5em 0 0.5em',\n verticalAlign: 'middle'\n }\n});","import PTheme from './theme';\n\nexport const viewStyles = {\n avatar: {\n display: 'inline-block',\n backgroundColor: '#6e6e6e',\n width: 32,\n height: 32,\n textAlign: 'center',\n marginRight: 10,\n paddingTop: 5,\n verticalAlign: 'bottom'\n },\n avatarSvg: {\n display: 'inline-block',\n textAlign: 'center',\n verticalAlign: 'middle'\n },\n break: {display: 'block', width: '100%', height: 0, border: 'none', margin: 0},\n buttonInline: {display: 'inline-block', marginRight: '1em'},\n divider: {\n display: 'block',\n width: '100%',\n height: 1,\n backgroundColor: '#2d5033',\n border: 'none',\n margin: '1em 0 0.5em 0'\n },\n error: {\n color: PTheme.palette.errorColor,\n },\n fieldDescription: {\n flex: '1 1 40%',\n display: 'inline-block',\n width: 'auto',\n height: '2em',\n fontSize: '12px',\n color: 'rgba(33,33,33,0.5)',\n verticalAlign: 'bottom',\n },\n fieldDescriptionTop: {\n display: 'block',\n fontSize: '14px',\n margin: 0,\n },\n fieldTitle: {\n display: 'block',\n width: '100%',\n fontSize: '20px',\n fontWeight: '500',\n color: 'rgba(33,33,33,0.5)',\n margin: '1em 0 1em 0',\n },\n fieldInput: {\n display: 'block',\n width: '100%',\n fontSize: '14px',\n color: 'rgba(33,33,33,0.8)',\n margin: '0 0 2em 0',\n },\n fieldInstructions: {\n display: 'block',\n width: '100%',\n fontSize: '14px',\n fontWeight: 'bold',\n color: 'rgba(33,33,33,0.5)',\n margin: '2em 0 2em 0',\n },\n fieldLabel: {\n display: 'block',\n fontSize: '14px',\n color: 'rgba(33,33,33,0.5)',\n margin: '0 0 4px 0',\n verticalAlign: 'bottom',\n },\n fieldLink: {color: '#2d5033', textDecoration: 'none', borderBottom: '1px dotted rgba(33,33,33,0.5)'},\n fieldMultiline: {\n minHeight: 40,\n fontSize: '14px',\n padding: '4px 4px 4px 2px',\n },\n fieldWide: {flex: '0 1 80%', display: 'block', minWidth: '80%', maxWidth: '100%', overflow: 'hidden'},\n fieldWrap: {\n whiteSpace: 'pre-wrap'\n },\n filterDescription: {\n display: 'block',\n width: 'auto',\n height: '2em',\n fontSize: '16px',\n color: 'rgba(33,33,33,0.5)',\n margin: '1em 0 0 16px',\n },\n filterHalf: {minWidth: '50%'},\n filterInline: {display: 'inline-block', fontSize: '16px', marginRight: 10},\n filterLeft: {fontSize: '16px', width: '100%', minWidth: '50%'},\n filterSelectSmall: {\n display: 'inline-block',\n width: 150,\n minWidth: 50,\n maxWidth: 150,\n marginTop: 0,\n marginRight: '1em',\n overflow: 'hidden'\n },\n filterThird: {minWidth: '33%'},\n hidden: {display: 'none'},\n marginBottom: {marginBottom: '1em'},\n marginLeft: {marginLeft: '1em'},\n marginRight: {marginRight: '1em'},\n marginTop: {marginTop: '1em'},\n noMargin: {margin: 0},\n noWrap: {whiteSpace: 'nowrap'},\n noPaddingTop: {paddingTop: 0},\n paddingBottom: {paddingBottom: '1em'},\n rowField: {flex: '0 1 30%', display: 'inline-block', margin: '0 1em 0 0', verticalAlign: 'top'},\n rowShowField: {display: 'inline-block', width: 'auto', minWidth: 100, margin: '0 1em 0 0', verticalAlign: 'top'},\n rowShowFieldWide: {\n display: 'inline-block',\n width: 'auto',\n minWidth: 200,\n margin: '0 1em 0 0',\n verticalAlign: 'top'\n }\n};\n","import React, {useEffect, useState} from 'react';\nimport {Form} from 'react-final-form';\nimport axios from 'axios';\nimport {\n TextInput\n} from 'react-admin';\nimport {RESOURCES as resources} from '../resources';\nimport {getPostHeaders} from '../utils/headers';\nimport FieldDescription from './FieldDescription';\nimport FieldDivider from './FieldDivider';\nimport {useDialogStyles, useLoadingStyles} from '../global/dialogStyles';\nimport {viewStyles} from '../global/styles';\nimport CircularProgress from '@material-ui/core/CircularProgress';\nimport Dialog from '@material-ui/core/Dialog';\nimport MuiDialogTitle from '@material-ui/core/DialogTitle';\nimport MuiDialogContent from '@material-ui/core/DialogContent';\nimport Button from '@material-ui/core/Button';\nimport IconButton from '@material-ui/core/IconButton';\nimport CloseIcon from '@material-ui/icons/Close';\nimport Typography from '@material-ui/core/Typography';\n\n/**\n * A Material UI Dialog to display a Contact Create form\n *\n * @param openDialog\n * @param onCloseFunc\n * @param onCompleteFunc\n * @param selectedOrgId\n * @param success\n * @returns {JSX.Element}\n * @constructor\n */\nconst ContactCreateDialog = (\n {\n openDialog,\n onCloseFunc,\n onCompleteFunc,\n selectedOrgId,\n success\n }) => {\n\n const [open, setOpen] = useState(false);\n const [submitting, setSubmitting] = useState(false);\n const [formMessage, setFormMessage] = useState({\n error: false,\n message: null\n });\n\n // Effect: Open dialog from parent\n useEffect(() => {\n return setOpen(openDialog);\n }, [openDialog]);\n\n const validateForm = (values) => {\n return !(\n !values.new_name\n );\n };\n\n const assembleFormData = (values) => {\n const v = values;\n return {\n org_id: selectedOrgId,\n name: v?.new_name ?? '',\n first_name: v?.new_first_name ?? '',\n last_name: v?.new_last_name ?? '',\n address: v?.new_address ?? '',\n address2: v?.new_address2 ?? '',\n city: v?.new_city ?? '',\n country: v?.new_country ?? '',\n state: v?.new_state ?? '',\n zip: v?.new_zip ?? '',\n email: v?.new_email ?? '',\n phone: v?.new_phone ?? '',\n notes: v?.new_notes ?? '',\n active: true\n };\n };\n\n const handleSubmit = (values) => {\n const formValues = assembleFormData(values);\n let errorMessage = 'Sorry, there was an error creating this Contact.';\n const resource = resources.Contact.CREATE(formValues);\n setSubmitting(true);\n axios({\n method: resource.method,\n url: resource.uri,\n data: formValues,\n headers: getPostHeaders(true)\n }).then((response) => {\n if (response.data && response.data.id) {\n setSubmitting(false);\n\n // Complete creation\n if (typeof onCompleteFunc === 'function') {\n onCompleteFunc(response.data);\n }\n if (!response.data) {\n setFormMessage({\n error: true,\n message: errorMessage\n });\n } else {\n setFormMessage({\n error: false,\n message: 'Contact created.'\n });\n }\n setTimeout(() => {\n handleClose(null);\n }, 1000);\n } else {\n setSubmitting(false);\n setFormMessage({\n error: true,\n message: errorMessage\n });\n }\n }).catch((error) => {\n if (error.response) {\n // Server response outside 2xx\n } else if (error.request) {\n // No response\n }\n setSubmitting(false);\n setFormMessage({\n error: true,\n message: errorMessage\n });\n });\n };\n\n const handleClose = () => {\n setOpen(false);\n if (typeof onCloseFunc === 'function') {\n onCloseFunc();\n }\n };\n\n const classes = useDialogStyles();\n const loadingClasses = useLoadingStyles();\n\n return (\n <>\n <Dialog\n fullWidth\n maxWidth={false}\n onClose={handleClose}\n aria-labelledby=\"Contact-Create\"\n open={open}\n className={classes.root}\n transitionDuration={{\n enter: 100,\n exit: 150\n }}\n >\n <MuiDialogTitle disableTypography className={classes.title}>\n <Typography variant=\"h6\">\n Create Contact\n </Typography>\n <IconButton aria-label=\"close\" className={classes.closeButton} onClick={handleClose}>\n <CloseIcon/>\n </IconButton>\n </MuiDialogTitle>\n <MuiDialogContent dividers>\n <Form\n onSubmit={handleSubmit}\n mutators={{\n setValue: ([field, value], state, {changeValue}) => {\n changeValue(state, field, () => value)\n }\n }}\n render={({form, handleSubmit, values}) => {\n return (\n <form onSubmit={handleSubmit}>\n <FieldDescription\n instructions={true} marginBottom={true}\n text='Add a Contact by entering details below.'\n />\n <TextInput label=\"Name of Contact *\" source=\"new_name\"\n helperText=\"Enter the name of the Contact. This may be a business name or the full name of a person.\"\n fullWidth={true}/>\n <TextInput label=\"First Name\" source=\"new_first_name\"\n formClassName=\"input-inline half\"/>\n <TextInput label=\"Last Name\" source=\"new_last_name\" formClassName=\"input-inline half\"/>\n <TextInput label=\"Address\" source=\"new_address\" fullWidth={true}/>\n <TextInput label=\"Address 2\" source=\"new_address2\" fullWidth={true}/>\n <TextInput label=\"City\" source=\"new_city\" formClassName=\"input-inline third\"/>\n <TextInput label=\"State\" source=\"new_state\" formClassName=\"input-inline third\"/>\n <TextInput label=\"ZIP/Postal Code\" source=\"new_zip\" formClassName=\"input-inline third\"/>\n <TextInput label=\"Country\" source=\"new_country\" formClassName=\"input-inline half\"/>\n <FieldDivider type=\"break\"/>\n <TextInput label=\"Email Address\" source=\"new_email\" formClassName=\"input-inline half\"/>\n <TextInput label=\"Phone\" source=\"new_phone\" formClassName=\"input-inline half\"/>\n <TextInput label=\"Notes\" source=\"new_notes\" multiline fullWidth={true}/>\n <FieldDivider type=\"break\" margin=\"bottom\"/>\n <FieldDescription\n marginBottom={true}\n description={true}\n text=\"After clicking Create Contact, this reference should be available to select.\"\n />\n <hr style={viewStyles.break}/>\n <Button\n type=\"button\"\n variant=\"contained\"\n color=\"primary\"\n style={viewStyles.buttonInline}\n disabled={(validateForm(values) === false || submitting || success)}\n onClick={() => handleSubmit()}\n >\n Create Contact\n </Button>\n <Button\n type=\"button\"\n variant=\"contained\"\n style={viewStyles.buttonInline}\n disabled={(submitting || success)}\n onClick={() => handleClose()}\n >\n Cancel\n </Button>\n {submitting &&\n <>\n <CircularProgress size={30} className={loadingClasses.root}/>\n <p className={loadingClasses.text}>Creating Contact...</p>\n </>\n }\n {formMessage.message &&\n <p className={(formMessage.error) ? loadingClasses.textError : loadingClasses.text}>\n {formMessage.message}\n </p>\n }\n </form>\n )\n }}\n >\n </Form>\n </MuiDialogContent>\n </Dialog>\n </>\n )\n};\n\nexport default ContactCreateDialog;\n","import React, {Fragment, useCallback, useEffect, useState} from 'react';\nimport {RESOURCES as resources} from '../resources';\nimport {postProcessData} from '../dataProviderPostProcess';\nimport {getGetHeaders} from '../utils/headers';\nimport axios from 'axios';\n\nconst styles = {\n container: {lineHeight: 1.4, margin: '0 0 4px 4px'},\n label: {fontStyle: 'italic'},\n name: {fontWeight: 600}\n};\n\n/**\n * A component for getting and displaying full Contact Details from an ID\n *\n * @param id\n * @param org_id\n * @return {JSX.Element}\n * @constructor\n */\nconst ContactDetailsFromID = ({id, org_id}) => {\n const [contact, setContact] = useState(null);\n const [contacts, setContacts] = useState([]);\n const [loaded, setLoaded] = useState(false);\n\n // Callback: Get Contacts\n const getContacts = useCallback(() => {\n let cfg = resources.Contact.GET_LIST({\n active: true,\n params: {\n filter: {\n filter_org_id: org_id\n },\n }\n });\n\n axios({\n method: cfg.method,\n url: cfg.uri,\n headers: getGetHeaders()\n })\n .then((response) => {\n if (response.data) {\n // Post-process the data as if a List view\n const rdata = postProcessData('Contact', 'GET_LIST', {}, response);\n setContacts(rdata.data);\n // Locate Contact by ID\n const item = rdata.data.find(r => r.id === id);\n if (item) {\n setContact(item);\n }\n }\n })\n .catch((err) => {\n console.log('Error retrieving Contacts');\n setContact(null);\n })\n .finally(() => {\n setLoaded(true);\n });\n }, [id, org_id]);\n\n // Effect: Get Contact list\n useEffect(\n () => {\n if (id && !loaded) {\n return getContacts();\n }\n\n }, [id, loaded, getContacts]\n );\n\n if (contacts.length === 0 || !contact) {\n return (\n <Fragment>\n </Fragment>\n );\n }\n\n return (\n <div style={styles.container}>\n <span style={styles.name}>{contact.name}</span><br/>\n {contact.first_name} {contact.last_name}<br/>\n {contact.address}<br/>\n {contact.address2}<br/>\n {contact.city}\n {contact.state && contact.state !== '' &&\n <Fragment>\n , {contact.state}\n </Fragment>\n } {contact.zip}\n <br/>\n {contact.country && contact.country !== '' &&\n <Fragment>\n {contact.country}\n <br/>\n </Fragment>\n }\n {contact.email && contact.email !== '' &&\n <Fragment>\n <span style={styles.label}>Email</span>: {contact.email}<br/>\n </Fragment>\n }\n {contact.phone && contact.phone &&\n <Fragment>\n <span style={styles.label}>Phone</span>: {contact.phone}\n </Fragment>\n }\n </div>\n );\n}\n\nexport default ContactDetailsFromID;\n","import React from 'react';\n\nexport const fdStyles = {\n field: {\n display: 'block',\n width: 'auto',\n fontSize: '14px',\n color: '#524b50',\n letterSpacing: '0.015em',\n verticalAlign: 'bottom',\n margin: '0 0 1em 0',\n },\n error: {\n color: '#b4212d'\n }\n};\n\n/**\n * React-Final-Form capable container for text content\n *\n * @param props\n * @return {*}\n * @constructor\n */\nconst FieldMessage = (props) => {\n\n let fieldStyle = fdStyles.field;\n if (props.error) {\n fieldStyle = {...fdStyles.field, ...fdStyles.error};\n }\n\n return (\n <span style={fieldStyle}>\n {props.text &&\n <>\n {props.text}\n </>\n }\n </span>\n )\n};\n\nexport default FieldMessage;\n","import React from 'react';\nimport {AutocompleteInput} from 'react-admin';\n\n/**\n * An autocomplete component with selection arrow\n */\nconst AutocompleteSelect = (props) => {\n const {\n allowEmpty,\n className,\n choices,\n disabled,\n isRequired,\n label,\n onChange,\n source,\n validate,\n emptyText = '',\n returnValueType = 'value'\n } = props;\n\n const handleChange = (e) => {\n let value = (e && e.id) ? e.id : e;\n if (returnValueType === 'object') {\n const idx = choices.findIndex(r => r.id === value);\n value = (idx !== -1) ? choices[idx] : null;\n }\n if (typeof onChange === 'function') {\n onChange(value, source);\n }\n };\n\n return (\n <span className={(className) ? className : undefined}>\n <span className=\"get-list-select-input\">\n <AutocompleteInput\n source={source}\n label={label}\n optionText=\"display_name\"\n emptyText={emptyText}\n choices={choices}\n allowEmpty={allowEmpty}\n required={isRequired}\n options={{\n placeholder: label,\n required: isRequired,\n suggestionsContainerProps: {\n modifiers: {\n computeStyle: {\n enabled: true,\n gpuAcceleration: false\n },\n applyStyle: {\n enabled: true,\n }\n }\n }\n }}\n disabled={(disabled) ? disabled : undefined}\n validate={(validate) ? validate : undefined}\n onChange={(e) => handleChange(e)}\n />\n <svg className=\"MuiSvgIcon-root MuiSelect-icon MuiSelect-iconFilled arrow\" focusable=\"false\"\n viewBox=\"0 0 24 24\" aria-hidden=\"true\">\n <path d=\"M7 10l5 5 5-5z\"/>\n </svg>\n </span>\n </span>\n );\n};\n\nexport default AutocompleteSelect;\n","import React, {Component} from 'react';\nimport PropTypes from 'prop-types';\nimport axios from 'axios';\nimport AutocompleteSelect from './AutocompleteSelect';\nimport {RESOURCES as resources} from '../resources';\nimport {RESOURCES as orderResources} from '../orderResources';\nimport {RESOURCES as productResources} from '../productResources';\nimport {getGetHeaders} from '../utils/headers';\nimport {sortArrayByKey} from '../utils/dataFunctions';\n\n/**\n * An autocomplete component that populates its own choices from an API\n */\nclass GetListSelectInput extends Component {\n constructor(props) {\n super(props);\n const selectedId = (this.props.selectedId) ? this.props.selectedId : '';\n this.state = {\n selectChoices: [],\n selectedId: selectedId\n };\n }\n\n componentDidMount() {\n const requiresFilter = this.props.requiresFilter;\n if (this.props.displayField && (!requiresFilter || this.props.filter)) {\n // If no filter is required or a filter is provided, fetch data\n this.fetchData();\n }\n }\n\n static getDerivedStateFromProps(nextProps, prevState) {\n if (!nextProps.displayField && prevState.selectChoices.length > 0) {\n // If field should not be displayed, clear its state\n return {\n selectChoices: []\n }\n }\n return null;\n }\n\n componentDidUpdate(prevProps, prevState, snapshot) {\n const displayField = this.props.displayField;\n if (displayField && this.props.requiresFilter) {\n if (JSON.stringify(this.props.filter) !== JSON.stringify(prevProps.filter)) {\n // If a filter is required and has been provided, fetch data\n this.fetchData();\n }\n }\n if (!prevProps.displayField && displayField) {\n // If a cleared field should be displayed, fetch data\n this.fetchData();\n }\n }\n\n fetchData() {\n let filter = this.props.filter;\n\n if (this.props.requiresFilter && (!filter || filter === {})) {\n // If a required filter is not provided, do not fetch\n return;\n }\n\n const params = {\n active: this.props.resourceActive,\n params: {\n filter: filter,\n pagination: {page: 1, perPage: 10000},\n sort: this.props.resourceSort\n }\n };\n const id = this.props.resourceId;\n if (id) {\n params.id = id;\n }\n\n let resource = resources;\n const resourceFile = this.props.resourceFile;\n if (resourceFile === 'order') {\n resource = orderResources;\n }\n if (resourceFile === 'product') {\n resource = productResources;\n }\n\n const cfg = resource[this.props.resourceName].GET_LIST(params);\n\n axios({\n method: 'GET',\n url: cfg.uri,\n headers: getGetHeaders(),\n maxBodyLength: Infinity,\n maxContentLength: Infinity\n }).then((response) => {\n if (response.data && response.data.length > 0) {\n const displayType = this.props.displayType;\n const displayArray = displayType.split(this.props.optionTextSeparator);\n let choices = this.assembleChoiceNames(response.data, displayArray);\n this.setState({\n selectChoices: choices\n })\n }\n // resolve(response);\n }).catch((error) => {\n console.log('error response for ' + this.props.resourceName + ': ', error);\n if (error.response) {\n // Server response outside 2xx\n } else if (error.request) {\n // No response\n }\n });\n }\n\n assembleChoiceNames(choices, displayArray) {\n let assembled = [];\n for (let choice of choices) {\n\n const separator = this.props.optionTextSeparator;\n\n // Construct a Display Name of up to four parts based on possible attribute values\n let display_name = choice[displayArray[0]];\n if (displayArray.length > 1) {\n display_name += (choice[displayArray[1]]) ? separator + choice[displayArray[1]] : '';\n }\n if (displayArray.length > 2) {\n display_name += (choice[displayArray[2]]) ? separator + choice[displayArray[2]] : '';\n }\n if (displayArray.length > 3) {\n display_name += (choice[displayArray[3]]) ? separator + choice[displayArray[3]] : '';\n }\n choice.display_name = display_name;\n choice.label = display_name;\n choice.value = choice.id;\n\n const excluded = this.props.excludedId;\n if (!excluded || excluded !== choice.id) {\n assembled.push(choice);\n }\n }\n const sortObj = this.props.resourceSort;\n const field = (sortObj.field) ? sortObj.field : 'id';\n const order = (sortObj.order) ? sortObj.order : 'ASC'\n if (field) {\n assembled = sortArrayByKey(assembled, field, order);\n }\n return assembled;\n }\n\n handleOnChange = (e, source) => {\n const value = (e && e.target && e.target.value) ? e.target.value : e;\n const changeFunc = this.props.onChangeFunc;\n if (changeFunc && typeof changeFunc === 'function') {\n changeFunc(value);\n }\n };\n\n render() {\n const {\n allowEmpty,\n className,\n disabled,\n displayField,\n emptyText,\n isRequired,\n label,\n returnValueType,\n source,\n validate\n } = this.props;\n\n const {\n selectChoices\n } = this.state;\n\n return (\n <AutocompleteSelect\n className={(className) ? className : undefined}\n source={source}\n label={label}\n optionText=\"display_name\"\n returnValueType={returnValueType}\n choices={(displayField) ? selectChoices : []}\n allowEmpty={allowEmpty}\n emptyText={emptyText}\n required={isRequired}\n options={{\n placeholder: label,\n required: isRequired,\n }}\n disabled={(disabled) ? disabled : undefined}\n validate={(validate) ? validate : undefined}\n onChange={(e) => this.handleOnChange(e, source)}\n />\n );\n }\n}\n\nGetListSelectInput.propTypes = {\n addLabel: PropTypes.bool,\n allowEmpty: PropTypes.bool,\n clearOnMount: PropTypes.bool,\n disabled: PropTypes.bool,\n displayField: PropTypes.bool,\n displayType: PropTypes.string,\n emptyText: PropTypes.string,\n excludedId: PropTypes.any,\n filter: PropTypes.object,\n isRequired: PropTypes.bool,\n label: PropTypes.string,\n onChangeFunc: PropTypes.func,\n optionTextSeparator: PropTypes.string,\n requiresFilter: PropTypes.bool,\n resourceActive: PropTypes.bool,\n resourceId: PropTypes.number,\n resourceName: PropTypes.string,\n resourceFile: PropTypes.string,\n resourceSort: PropTypes.object,\n returnValueType: PropTypes.string,\n selectedId: PropTypes.any,\n source: PropTypes.string,\n validate: PropTypes.any\n};\n\nGetListSelectInput.defaultProps = {\n addLabel: true,\n allowEmpty: true,\n clearOnMount: false,\n disabled: false,\n displayField: true,\n displayType: 'id - name',\n emptyText: '',\n filter: null,\n isRequired: false,\n optionTextSeparator: ' - ',\n requiresFilter: false,\n resourceActive: true,\n resourceFile: 'default',\n resourceSort: {field: 'id', order: 'ASC'},\n returnValueType: 'value',\n selectedId: '',\n source: \"id\"\n};\n\nexport default GetListSelectInput;\n","import React from 'react';\n\nconst IconSortArrowDown = ({classes = ''}) => {\n return (\n <span className={`icon-sort-arrow down ${classes}`}>\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\" viewBox=\"0 0 18 18\">\n <path d=\"M5 8l4 4 4-4z\"/>\n </svg>\n </span>\n )\n};\n\nexport default IconSortArrowDown;\n","import React from 'react';\n\nconst IconSortArrowUp = ({classes = ''}) => {\n return (\n <span className={`icon-sort-arrow up ${classes}`}>\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\" viewBox=\"0 0 18 18\">\n <path d=\"M9 6l-4 4h8z\"/>\n </svg>\n </span>\n )\n};\n\nexport default IconSortArrowUp;\n","import React from 'react';\nimport Box from '@material-ui/core/Box';\nimport {makeStyles} from '@material-ui/core/styles';\nimport CircularProgress from '@material-ui/core/CircularProgress';\n\nconst useLoadingStyles = makeStyles({\n root: {\n padding: '10px 2em 10px 2em'\n }\n});\n\nconst useLoadingContentStyles = makeStyles({\n root: {\n display: 'inline-block',\n fontWeight: 500,\n margin: '0 0.5em',\n verticalAlign: 'bottom'\n }\n});\n\nconst loadingContentStyles = {\n display: 'inline-block',\n fontSize: 16,\n fontWeight: 500,\n letterSpacing: '0.015em',\n margin: '0 0.5em',\n verticalAlign: 'bottom'\n};\n\nconst ListLoading = ({text = 'Loading...'}) => {\n\n const classes = useLoadingStyles();\n const contentClasses = useLoadingContentStyles();\n\n return (\n <Box textAlign=\"left\" m={1} classes={classes}>\n <CircularProgress size={30} classes={contentClasses}/>\n <p style={loadingContentStyles}>{text}</p>\n </Box>\n )\n};\n\nexport default ListLoading;\n","import React from 'react';\nimport Box from '@material-ui/core/Box';\nimport {makeStyles} from '@material-ui/core/styles';\n\nconst usePromptStyles = makeStyles({\n root: {\n padding: '12px 1em 10px 1em'\n }\n});\n\nconst promptContentStyles = {\n display: 'block',\n fontSize: 16,\n fontWeight: 500,\n letterSpacing: '0.015em',\n margin: 0\n};\n\nconst ListMessage = ({text}) => {\n\n const classes = usePromptStyles();\n\n return (\n <Box textAlign=\"left\" m={1} classes={classes}>\n <p style={promptContentStyles}>\n {text}\n </p>\n </Box>\n )\n};\n\nexport default ListMessage;\n","import React, {useEffect, useState} from 'react';\nimport ListLoading from './ListLoading';\nimport {makeStyles} from '@material-ui/core/styles';\nimport Button from '@material-ui/core/Button';\nimport Dialog from '@material-ui/core/Dialog';\nimport HighlightOffIcon from '@material-ui/icons/HighlightOff';\nimport IconButton from '@material-ui/core/IconButton';\nimport MuiDialogTitle from '@material-ui/core/DialogTitle';\nimport MuiDialogContent from '@material-ui/core/DialogContent';\nimport CloseIcon from '@material-ui/icons/Close';\nimport Typography from '@material-ui/core/Typography';\n\nconst useDialogStyles = makeStyles({\n actions: {\n textAlign: 'right'\n },\n root: {\n margin: 0,\n padding: 12,\n },\n btnClose: {\n position: 'absolute',\n right: 10,\n top: 8,\n color: '#666666',\n },\n btnDialog: {\n margin: '0 0.5em 0 0.5em',\n verticalAlign: 'middle'\n }\n});\n\n/**\n * A Material UI Dialog to display deletion options\n *\n * @param openDialog\n * @param onCloseFunc\n * @param onDeleteFunc\n * @param resourceName\n * @param resourceId\n * @return {JSX.Element}\n * @constructor\n */\nconst DeleteDialog = (\n {\n openDialog,\n onCloseFunc,\n onDeleteFunc,\n resourceName,\n resourceId\n }) => {\n\n const [open, setOpen] = useState(false);\n const [deleting, setDeleting] = useState(false);\n\n useEffect(\n () => {\n\n const resetDialog = () => {\n setDeleting(false);\n setOpen(openDialog);\n };\n\n return resetDialog();\n\n }, [openDialog]\n );\n\n const handleClose = () => {\n setDeleting(false);\n setOpen(false);\n if (typeof onCloseFunc === 'function') {\n onCloseFunc();\n }\n };\n\n const handleDelete = () => {\n setDeleting(true);\n if (typeof onDeleteFunc === 'function') {\n onDeleteFunc();\n }\n };\n\n const classes = useDialogStyles();\n\n return (\n <>\n <Dialog onClose={handleClose} aria-labelledby=\"Delete-Dialog\" open={open} fullWidth={true} maxWidth=\"sm\">\n <MuiDialogTitle disableTypography className={classes.root}>\n <Typography variant=\"h6\">\n Delete{(resourceName) ? ' ' + resourceName : ''}{(resourceId) ? ' ' + resourceId : ''}?\n </Typography>\n <IconButton aria-label=\"close\" className={classes.btnClose} onClick={handleClose}>\n <CloseIcon/>\n </IconButton>\n </MuiDialogTitle>\n <MuiDialogContent dividers className={classes.actions}>\n\n {!deleting &&\n <>\n <Button\n variant=\"outlined\"\n color=\"primary\"\n onClick={() => handleClose()}\n className={classes.btnDialog}\n >\n Cancel\n </Button>\n <Button\n variant=\"contained\"\n color=\"primary\"\n startIcon={<HighlightOffIcon/>}\n onClick={() => handleDelete()}\n className={classes.btnDialog}\n >\n Delete\n </Button>\n </>\n }\n\n {deleting &&\n <>\n <ListLoading text=\"Deleting...\"/>\n </>\n }\n </MuiDialogContent>\n </Dialog>\n </>\n )\n};\n\nexport default DeleteDialog;\n","import React from 'react';\nimport {\n EditButton,\n ShowButton\n} from 'react-admin';\nimport DeleteWithDialog from '../components/DeleteWithDialog';\n\n/**\n * Default filter for React Table\n *\n * @param filterValue\n * @param setFilter\n * @param onUpdate\n * @return {JSX.Element}\n * @constructor\n */\nexport const DefaultColumnFilter = (\n {\n column: {id, filterValue, setFilter}\n }) => {\n return (\n <input\n value={filterValue || ''}\n onChange={e => {\n setFilter(e.target.value || undefined);\n }}\n placeholder=\"Search\"\n className=\"table-filter-default\"\n />\n )\n};\n\n/**\n * Filter for React Table with auto-focus\n *\n * @param filterValue\n * @param setFilter\n * @param onUpdate\n * @return {JSX.Element}\n * @constructor\n */\nexport const FocusedColumnFilter = (\n {\n column: {id, isSorted, filterValue, setFilter}\n }) => {\n return (\n <input\n autoFocus={(isSorted) ? true : undefined}\n value={filterValue || ''}\n onChange={e => {\n setFilter(e.target.value || undefined);\n }}\n placeholder=\"Search\"\n className=\"table-filter-default\"\n />\n )\n};\n\n/**\n * Default filter for React Table with total count\n *\n * @param filterValue\n * @param preFilteredRows\n * @param setFilter\n * @return {JSX.Element}\n * @constructor\n */\nexport const DefaultColumnFilterWithRecord = (\n {\n column: {filterValue, preFilteredRows, setFilter},\n }) => {\n\n const count = preFilteredRows.length;\n\n return (\n <input\n value={filterValue || ''}\n onChange={e => {\n setFilter(e.target.value || undefined)\n }}\n placeholder={`Search ${count} records...`}\n className=\"table-filter-default\"\n />\n )\n};\n\n/**\n * Return React Table column object for Edit Button\n *\n */\nexport const editButtonColumnObject = () => {\n return {\n Header: () => null,\n id: 'list-edit',\n Cell: ({row, basePath}) => (\n <EditButton basePath={basePath} record={row.original} label=\"\" title=\"Edit\" className=\"table-icon-button\"/>\n ),\n width: 80,\n maxWidth: 80,\n disableFilters: true,\n disableSortBy: true\n }\n};\n\n/**\n * Return React Table column object for Delete Button\n *\n */\nexport const deleteButtonColumnObject = (label, resourceFile, resourceName, resourceParam) => {\n return {\n Header: () => null,\n id: 'list-delete',\n Cell: ({row}) => (\n <DeleteWithDialog\n type=\"icon\"\n label={label}\n title={label}\n resourceFile={resourceFile}\n resourceName={resourceName}\n resourceParam={resourceParam}\n record={row.original}\n className=\"table-icon-button\"\n />\n ),\n width: 80,\n maxWidth: 80,\n disableFilters: true,\n disableSortBy: true\n }\n};\n\n/**\n * Return React Table column object for Show Button\n *\n */\nexport const showButtonColumnObject = () => {\n return {\n Header: () => null,\n id: 'list-show',\n Cell: ({row, basePath}) => (\n <ShowButton basePath={basePath} record={row.original} label=\"\" title=\"Details\"\n className=\"table-icon-button\"/>\n ),\n width: 80,\n maxWidth: 80,\n disableFilters: true,\n disableSortBy: true\n }\n};\n","import React, {useEffect, useMemo, useState} from 'react';\nimport PropTypes from 'prop-types';\nimport {useTable, usePagination, useFilters, useSortBy} from 'react-table';\nimport IconSortArrowDown from '../css/images/IconSortArrowDown';\nimport IconSortArrowUp from '../css/images/IconSortArrowUp';\nimport ListLoading from './ListLoading';\nimport ListMessage from './ListMessage';\nimport {DefaultColumnFilter, FocusedColumnFilter} from '../utils/tableFunctions';\nimport TablePagination from '@material-ui/core/TablePagination';\n\n/**\n * A component that renders a React Table\n *\n * @param props\n * @return {JSX.Element|null}\n * @constructor\n */\nconst ListTable = (props) => {\n const {\n basePath,\n columns,\n data,\n includePagination,\n loaded,\n perPage,\n sort,\n listFilters = null,\n listFilter = null,\n messageEmpty = '',\n messageFilter = '',\n instructions = '',\n focusOnLoad = false,\n rowStyle,\n tableHeight\n } = props;\n\n // Set state of table list\n const [tableList, setTableList] = useState([]);\n\n // Update table list state upon new data\n useEffect(() => {\n // Create an array of data the table can use based on React-Admin's ids and data\n const setTableData = () => {\n let list = [];\n let total = data.length;\n if (total > 0) {\n // Assemble an array based on React-Admin ids and data\n for (let i = 0; i < total; i++) {\n let item = data[i];\n if (item) {\n list.push(item);\n }\n }\n }\n setTableList(list);\n };\n\n return setTableData();\n\n }, [data]);\n\n // Memoized Table Data\n const tableData = useMemo(() => tableList, [tableList]);\n\n // Memoized Table Columns\n const tableColumns = useMemo(() => columns, [columns]);\n\n // Default Sort column\n const sortBy = (sort) ? {id: sort.field, desc: (sort.order) === 'DESC'} : {id: 'id', desc: false};\n\n // Initial sort & pagination values\n const initialState = {\n pageIndex: 0,\n pageSize: (perPage) ? perPage : 10,\n sortBy: [sortBy]\n };\n\n // Default Filter\n const defaultColumn = React.useMemo(\n () => ({\n Filter: (focusOnLoad) ? FocusedColumnFilter : DefaultColumnFilter,\n }), [focusOnLoad]\n );\n\n // Table Definition\n const {\n getTableProps,\n getTableBodyProps,\n headerGroups,\n prepareRow,\n page,\n rows,\n gotoPage,\n state: {pageIndex}\n } = useTable(\n {\n columns: tableColumns,\n data: tableData,\n defaultColumn: defaultColumn,\n initialState: initialState\n },\n useFilters,\n useSortBy,\n usePagination\n );\n\n // Display loading before resource has responded\n if (loaded === false) {\n return (\n <ListLoading/>\n )\n }\n\n // Display message or prompt if empty\n if (loaded && (data.length === 0)) {\n let message;\n if (listFilters && listFilter && props[listFilters] && props[listFilters][listFilter] && messageEmpty) {\n message = messageEmpty;\n } else if (listFilters && listFilter) {\n message = messageFilter;\n } else {\n message = messageEmpty;\n }\n return (\n <ListMessage text={message}/>\n )\n }\n\n // Set additional data to pass to cells\n const cellProps = {\n basePath: basePath\n };\n\n const tableStyle = (tableHeight) ? {height: tableHeight, overflow: 'auto'} : {};\n\n // Render table\n return (\n <>\n {instructions &&\n <p className=\"data-table-instructions\">{instructions}</p>\n }\n <div className=\"list-table-container\" style={tableStyle}>\n <table {...getTableProps()} className=\"list-table list-react-table\">\n\n <thead>\n {headerGroups.map(headerGroup => (\n <tr {...headerGroup.getHeaderGroupProps()}>\n {headerGroup.headers.map(column => (\n <th {...column.getHeaderProps()}>\n {/* Table Header Label & Sort */}\n <div {...column.getSortByToggleProps()}>\n {column.render('Header')}\n {column.canSort &&\n <span className=\"sort-icon\">\n {column.isSorted\n ? column.isSortedDesc\n ? <IconSortArrowDown/>\n : <IconSortArrowUp/>\n : <IconSortArrowDown classes=\"disabled\"/>}\n </span>\n }\n </div>\n {/* Table Header Filter */}\n <div className=\"column-filter\">\n {column.canFilter ? column.render('Filter') : null}\n </div>\n </th>\n ))}\n </tr>\n ))}\n </thead>\n\n {/* Table Body with paginated rows */}\n <tbody {...getTableBodyProps()}>\n {page.map((row, i) => {\n prepareRow(row)\n return (\n <tr {...row.getRowProps()} style={(rowStyle) ? rowStyle(row) : undefined}>\n {row.cells.map(cell => {\n return (\n <td {...cell.getCellProps()}>\n {cell.render('Cell', cellProps)}\n </td>\n )\n })}\n </tr>\n )\n })}\n </tbody>\n </table>\n </div>\n\n {/* Table Pagination */}\n {includePagination &&\n <TablePagination\n component=\"div\"\n count={rows.length}\n page={pageIndex}\n rowsPerPage={initialState.pageSize}\n rowsPerPageOptions={[]}\n onPageChange={(e, newPage) => {\n gotoPage((newPage) ? Number(newPage) : 0)\n }}\n />\n }\n </>\n )\n};\n\n\nListTable.propTypes = {\n basePath: PropTypes.string,\n body: PropTypes.element,\n children: PropTypes.node,\n classes: PropTypes.object,\n className: PropTypes.string,\n currentSort: PropTypes.shape({\n field: PropTypes.string,\n order: PropTypes.string,\n }),\n data: PropTypes.array,\n includePagination: PropTypes.bool,\n instructions: PropTypes.string,\n loaded: PropTypes.bool,\n tableHeight: PropTypes.number,\n // Ignored\n expand: PropTypes.oneOfType([PropTypes.element, PropTypes.elementType]),\n hasBulkActions: PropTypes.bool,\n hover: PropTypes.bool,\n loading: PropTypes.bool,\n onSelect: PropTypes.func,\n onToggleItem: PropTypes.func,\n resource: PropTypes.string,\n rowClick: PropTypes.oneOfType([PropTypes.string, PropTypes.func]),\n rowStyle: PropTypes.func,\n selectedIds: PropTypes.arrayOf(PropTypes.any),\n setSort: PropTypes.func,\n version: PropTypes.number,\n isRowSelectable: PropTypes.func,\n};\n\nexport default ListTable;\n","import React, {useEffect, useState} from 'react';\nimport {makeStyles} from '@material-ui/core/styles';\nimport Dialog from '@material-ui/core/Dialog';\nimport MuiDialogTitle from '@material-ui/core/DialogTitle';\nimport MuiDialogContent from '@material-ui/core/DialogContent';\nimport CheckCircleRoundedIcon from '@material-ui/icons/CheckCircleRounded';\nimport CloseIcon from '@material-ui/icons/Close';\nimport IconButton from '@material-ui/core/IconButton';\nimport Table from '@material-ui/core/Table';\nimport TableBody from '@material-ui/core/TableBody';\nimport TableCell from '@material-ui/core/TableCell';\nimport TableHead from '@material-ui/core/TableHead';\nimport TableRow from '@material-ui/core/TableRow';\nimport TextField from '@material-ui/core/TextField';\n\nconst useDialogStyles = makeStyles({\n root: {\n margin: 0,\n padding: 24,\n },\n dialog: {\n margin: 2\n },\n closeButton: {\n position: 'absolute',\n right: 10,\n top: 2,\n color: '#666666',\n },\n btn: {\n marginTop: -4,\n marginRight: 4,\n padding: 2\n },\n btnAdd: {\n padding: 2\n },\n btnIcon: {\n padding: 2\n },\n btnInfo: {\n position: 'absolute',\n top: 2,\n right: 4,\n padding: 2\n },\n btnText: {\n marginRight: 6,\n padding: '0px 10px'\n },\n inputCheckbox: {\n padding: 2\n },\n inputQty: {\n width: 90\n },\n saving: {\n color: 'rgba(0, 0, 0, 0.54)'\n },\n table: {},\n tHead: {},\n tBody: {},\n tr: {},\n trAdded: {\n backgroundColor: 'rgba(180, 220, 180, 0.3)'\n },\n th: {\n lineHeight: '1.2',\n padding: '5px 12px 5px 12px',\n verticalAlign: 'bottom'\n },\n td: {\n position: 'relative',\n padding: '5px 12px 5px 12px'\n },\n tdName: {\n position: 'relative',\n padding: '5px 32px 5px 12px'\n },\n tdSku: {\n position: 'relative',\n whiteSpace: 'nowrap',\n padding: '5px 12px 5px 12px'\n }\n});\n\n/**\n * A Material UI Dialog to display Product Details for editing in an Order\n *\n * @param openDialog\n * @param product\n * @param onCloseFunc\n * @param onSaveFunc\n * @param dialogType\n * @return {JSX.Element}\n * @constructor\n */\nconst OrderReceiptProductEditDialog = (\n {\n openDialog,\n product,\n onCloseFunc,\n onSaveFunc,\n dialogType\n }) => {\n\n const [productId, setProductId] = useState(null);\n const [open, setOpen] = useState(false);\n const [qtyRequested, setQtyRequested] = useState(0);\n\n useEffect(\n () => {\n // If current Product is set or has changed, open dialog\n if (\n product ||\n (product && product.id !== productId)\n ) {\n setProductId(product.id);\n setQtyRequested((product.qty_requested) ? product.qty_requested : 0);\n setOpen(true);\n }\n\n }, [product, productId]\n );\n\n const handleEditUpdate = (e, type) => {\n let value = (e.target?.value) ? parseInt(e.target.value) : 0;\n if (value < 0) {\n value = 0;\n }\n if (type === 'qty_requested') {\n if (dialogType === 'order' && value > product.qty) {\n value = product.qty;\n }\n setQtyRequested(value ?? product.qty_requested);\n }\n };\n\n const handleSave = () => {\n setOpen(false);\n if (typeof onSaveFunc === 'function') {\n onSaveFunc({\n product: product,\n qty_requested: qtyRequested\n });\n }\n };\n\n const handleClose = () => {\n setOpen(false);\n if (typeof onCloseFunc === 'function') {\n onCloseFunc();\n }\n };\n\n const classes = useDialogStyles();\n\n return (\n <>\n <Dialog\n maxWidth={false}\n onClose={handleClose}\n aria-labelledby=\"Product-Detail\"\n open={open}\n className={classes.dialog}\n transitionDuration={{\n enter: 100,\n exit: 150\n }}\n >\n <MuiDialogTitle disableTypography className={classes.root}>\n <IconButton aria-label=\"close\" className={classes.closeButton} onClick={handleClose}>\n <CloseIcon/>\n </IconButton>\n </MuiDialogTitle>\n <MuiDialogContent dividers>\n {product &&\n <>\n <Table className={classes.table} size=\"small\" stickyHeader aria-label=\"Add Item\">\n <TableHead className={classes.tHead}>\n <TableRow>\n <TableCell className={classes.th}>SKU</TableCell>\n <TableCell className={classes.th}>Title</TableCell>\n <TableCell className={classes.th}>Category</TableCell>\n <TableCell className={classes.th}>Product</TableCell>\n {dialogType === 'order' &&\n <>\n <TableCell align=\"right\"\n className={classes.th}>Qty<br/>Available</TableCell>\n <TableCell align=\"right\"\n className={classes.th}>Qty<br/>Requested</TableCell>\n </>\n }\n <TableCell align=\"right\" className={classes.th}>Add</TableCell>\n </TableRow>\n </TableHead>\n <TableBody className={classes.tBody}>\n <TableRow\n className={classes.tr}\n key={`order-item-edit-${product.id}`}>\n\n <TableCell className={classes.tdSku}>{product.sku}</TableCell>\n <TableCell className={classes.td}>{product.show_name}</TableCell>\n <TableCell className={classes.td}>{product.type_name}</TableCell>\n <TableCell className={classes.tdName}>\n {product.title}  \n </TableCell>\n\n <TableCell align=\"right\" className={classes.td}>\n {dialogType === 'order' &&\n <>{(product && product.qty) ? product.qty : '0'}</>\n }\n </TableCell>\n\n <TableCell align=\"right\" className={classes.td}>\n <TextField\n type=\"number\"\n variant=\"outlined\"\n id={`add-${dialogType}-item-qty-${product.id}`}\n label=\"\"\n placeholder=\"0\"\n value={(qtyRequested) ? qtyRequested : 0}\n className=\"input-table-small number mr-0\"\n onChange={(e) => handleEditUpdate(e, 'qty_requested')}\n InputProps={{\n inputProps: {\n max: (dialogType === 'order') ? product.qty : undefined,\n min: 0,\n step: 1\n }\n }}\n />\n </TableCell>\n\n <TableCell align=\"right\" className={classes.td}>\n <IconButton\n aria-label=\"Save\"\n color=\"primary\"\n className={classes.btnIcon}\n onClick={() => handleSave()}\n >\n <CheckCircleRoundedIcon/>\n </IconButton>\n\n </TableCell>\n </TableRow>\n </TableBody>\n </Table>\n {dialogType === 'order' &&\n <p className=\"message-qty active mt-1\">\n <em>Note</em>: This Product has {product.qty}\n {(product.qty === 1) ? ' item' : ' items'} available. Requested\n Qty is limited to the available quantity.\n </p>\n }\n </>\n }\n </MuiDialogContent>\n </Dialog>\n </>\n )\n};\n\nexport default OrderReceiptProductEditDialog;\n","import React, {useEffect, useState} from 'react';\nimport PropTypes from 'prop-types';\nimport axios from 'axios';\nimport {ImageField, ImageInput, useRefresh} from 'react-admin';\nimport {RESOURCES as resources} from '../productResources';\nimport FieldDescription from './FieldDescription';\nimport FieldDivider from './FieldDivider';\nimport IconButton from '@material-ui/core/IconButton';\nimport DeleteIcon from '@material-ui/icons/Delete';\nimport {makeStyles} from '@material-ui/core/styles';\n\nconst useStyles = makeStyles({\n root: {\n fontWeight: 500\n }\n});\n\n/**\n * A component to retrieve, display and upload Product Images\n *\n */\nconst ProductImage = ({addLabel = true, allowUpload = false, label = 'Thumbnail', record = {}, renderType = 'Edit', source = 'thumbnail'}) => {\n const imageType = (record.thumbnail) ? record.thumbnail.substr(record.thumbnail.indexOf('.') + 1) : 'jpg';\n const [state, setState] = useState({\n imageType: imageType,\n newImageFile: null,\n newImageSrc: '',\n thumbnailPath: (record && record.thumbnail) ? record.thumbnail : '',\n thumbnailSrc: ''\n });\n const refresh = useRefresh();\n\n useEffect(() => {\n const fetchData = () => {\n const params = {\n image_path: record.thumbnail\n };\n\n const cfg = resources.ProductImage.GET_ONE(params);\n\n axios({\n method: 'GET',\n url: cfg.uri,\n headers: {\n 'Cache-Control': 'no-cache',\n 'Content-Type': 'image/' + state.imageType\n },\n responseType: 'blob'\n }).then((response) => {\n if (response && response.data) {\n const src = URL.createObjectURL(response.data);\n setState({\n ...state,\n thumbnailSrc: src\n });\n }\n }).catch((error) => {\n // console.log('error response for Product Image: ', error);\n if (error.response) {\n // Server response outside 2xx\n } else if (error.request) {\n // No response\n }\n });\n };\n if (record && record.thumbnail && (renderType === 'show' || renderType === 'edit')) {\n fetchData();\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n const deleteImage = () => {\n const params = {\n product_id: record.id\n };\n const cfg = resources.ProductImage.DELETE(params);\n\n axios({\n method: cfg.method,\n url: cfg.uri\n }).then((response) => {\n setTimeout(() => {\n refresh();\n }, 1000);\n }).catch((error) => {\n console.log('error response for Product Image: ', error);\n if (error.response) {\n // Server response outside 2xx\n } else if (error.request) {\n // No response\n }\n });\n };\n\n const handleDelete = () => {\n deleteImage();\n };\n\n const {thumbnailSrc} = state;\n const uploadText = (thumbnailSrc && renderType === 'edit') ? 'Replace Product Image' : 'Upload a Product Image';\n const classes = useStyles();\n\n return (\n <>\n <FieldDivider type=\"divider\" margin=\"bottom\"/>\n <FieldDescription header={true} margin=\"bottom\" text=\"Product Image\"/>\n <FieldDivider type=\"break\" margin=\"bottom\"/>\n\n <span className=\"product-image thumbnail\">\n {thumbnailSrc &&\n <>\n {(renderType === 'edit') &&\n <IconButton aria-label=\"delete\" className=\"delete-icon\" onClick={handleDelete}>\n <DeleteIcon fontSize=\"small\"/>\n </IconButton>\n }\n <img src={thumbnailSrc} alt=\"Product\"/>\n </>\n }\n </span>\n <FieldDivider type=\"break\" margin=\"bottom\"/>\n\n {allowUpload &&\n\n <span className=\"product-image-upload\">\n <ImageInput\n label={uploadText}\n source=\"product_image_input\"\n accept=\"image/*\"\n multiple={false}\n minSize={500}\n maxSize={5000000}\n placeholder=\"Drop an Image or click to Browse\"\n fullWidth={false}\n className={classes.root}\n >\n <ImageField source=\"product_image\" label=\"\"/>\n </ImageInput>\n </span>\n }\n\n {(renderType === 'create' || renderType === 'edit') &&\n <FieldDivider type=\"divider\" margin=\"bottom\"/>\n }\n </>\n );\n};\n\nProductImage.propTypes = {\n addLabel: PropTypes.bool,\n allowUpload: PropTypes.bool,\n label: PropTypes.string,\n record: PropTypes.object,\n renderType: PropTypes.string,\n source: PropTypes.string\n};\n\nexport default ProductImage;\n","import React, {useEffect, useState} from 'react';\nimport axios from 'axios';\nimport {\n SimpleShowLayout,\n TextField,\n} from 'react-admin';\nimport {RESOURCES as resources} from '../productResources';\nimport {getGetHeaders} from '../utils/headers';\nimport FieldDivider from './FieldDivider';\nimport ProductImage from './ProductImage';\nimport {makeStyles} from '@material-ui/core/styles';\nimport Dialog from '@material-ui/core/Dialog';\nimport MuiDialogTitle from '@material-ui/core/DialogTitle';\nimport MuiDialogContent from '@material-ui/core/DialogContent';\nimport IconButton from '@material-ui/core/IconButton';\nimport CloseIcon from '@material-ui/icons/Close';\nimport Typography from '@material-ui/core/Typography';\n\nconst useDialogStyles = makeStyles({\n root: {\n margin: 0,\n padding: 12,\n },\n closeButton: {\n position: 'absolute',\n right: 10,\n top: 8,\n color: '#666666',\n },\n});\n\n/**\n * A Material UI Dialog to display Product Details\n *\n * @param openDialog\n * @param productId\n * @param onCloseFunc\n * @param props\n * @return {JSX.Element}\n * @constructor\n */\nconst ProductDetailDialog = (\n {\n openDialog,\n productId,\n onCloseFunc,\n ...props\n }) => {\n\n const [record, setRecord] = useState(null);\n const [open, setOpen] = useState(false);\n\n useEffect(\n () => {\n const fetchItem = () => {\n const cfg = resources.Product.GET_ONE({id: productId});\n axios({\n method: 'GET',\n url: cfg.uri,\n headers: getGetHeaders()\n }).then((response) => {\n if (response.data) {\n let type_display_name = response.data?.type_name ?? '';\n if (response.data.parent_type_name && response.data.type_name) {\n type_display_name = response.data.parent_type_name + ' > ' + type_display_name;\n }\n response.data.type_display_name = type_display_name;\n setRecord(response.data);\n setOpen(true);\n } else {\n setRecord(null);\n }\n }).catch((error) => {\n console.log('error response for Product: ', error);\n if (error.response) {\n // Server response outside 2xx\n } else if (error.request) {\n // No response\n }\n });\n };\n\n // If current Item ID is set or has changed, fetch that Product\n if (\n (productId && !record) ||\n (productId && record && (parseInt(record.id, 10) !== parseInt(productId, 10)))\n ) {\n fetchItem();\n }\n\n }, [productId, record]\n );\n\n const handleClose = () => {\n setOpen(false);\n setRecord(null);\n if (typeof onCloseFunc === 'function') {\n onCloseFunc();\n }\n };\n\n const classes = useDialogStyles();\n\n return (\n <>\n <Dialog\n onClose={handleClose}\n aria-labelledby=\"Product-Detail\"\n open={open}\n transitionDuration={{\n enter: 100,\n exit: 150\n }}\n >\n <MuiDialogTitle disableTypography className={classes.root}>\n <Typography variant=\"h6\">\n {record && record.title &&\n <>\n Product {record.title}\n </>\n }\n </Typography>\n <IconButton aria-label=\"close\" className={classes.closeButton} onClick={handleClose}>\n <CloseIcon/>\n </IconButton>\n </MuiDialogTitle>\n <MuiDialogContent dividers>\n {record &&\n <SimpleShowLayout record={record} className=\"show-modal\">\n <TextField label=\"ID\" source=\"id\" className=\"input-inline input-220\"/>\n <TextField label=\"SKU\" source=\"sku\" className=\"input-inline input-220\"/>\n <FieldDivider type=\"break\" margin=\"bottom\"/>\n <TextField label=\"Title\" source=\"show_name\" className=\"input-inline input-220\"/>\n <TextField label=\"Product Category\" source=\"type_display_name\" className=\"input-inline input-220\"/>\n <FieldDivider type=\"break\" margin=\"bottom\"/>\n <TextField label=\"Name of Product\" source=\"title\" className=\"field-bg\"/>\n <ProductImage renderType=\"show\" label=\"Product Image\" allowUpload={false} {...props}/>\n <TextField label=\"Description\" source=\"description\" className=\"field-bg\"/>\n <TextField label=\"Total Qty\" source=\"qty\" className=\"input-inline input-120\"/>\n </SimpleShowLayout>\n }\n </MuiDialogContent>\n </Dialog>\n </>\n )\n};\n\nexport default ProductDetailDialog;\n","import React, {useCallback, useEffect, useRef, useState} from 'react';\nimport axios from 'axios';\nimport {RESOURCES as resources} from '../productResources';\n\n/**\n * A component to retrieve and display a Product Thumbnail for a list\n *\n */\nconst ProductThumbnail = ({id = '', title = '', thumbnail = ''}) => {\n\n const mounted = useRef(false);\n const [productId, setProductId] = useState(id);\n const [productThumbnail, setProductThumbnail] = useState('');\n const [src, setSrc] = useState('');\n\n const fetchData = useCallback((path) => {\n if (path && path !== '') {\n const imageType = (path) ? path.substring(path.indexOf('.') + 1) : 'jpg';\n const thumbPath = path.replace('/assets', '/thumbnail');\n const cfg = resources.ProductImageThumbnail.GET_ONE({image_path: thumbPath});\n axios({\n method: 'GET',\n url: cfg.uri,\n headers: {\n 'Content-Type': 'image/' + imageType\n },\n responseType: 'blob'\n }).then((response) => {\n if (response && response.data) {\n let obj = URL.createObjectURL(response.data);\n if (mounted.current === true) {\n setSrc(obj);\n }\n }\n }).catch((error) => {\n if (error.response) {\n // Server response outside 2xx\n } else if (error.request) {\n // No response\n }\n });\n }\n }, []);\n\n useEffect(() => {\n mounted.current = true;\n\n if (id !== productId || thumbnail !== productThumbnail) {\n setProductId(id);\n setProductThumbnail(thumbnail);\n setSrc('');\n fetchData(thumbnail);\n }\n return () => {\n mounted.current = false;\n };\n\n }, [id, productId, src, thumbnail, productThumbnail, fetchData]);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n\n return (\n <span className=\"product-image list-thumbnail\">\n {src !== '' &&\n <>\n <img src={src} alt={title}/>\n <span className=\"enlarge\">\n <img src={src} alt={title}/>\n </span>\n </>\n }\n </span>\n );\n};\n\nexport default ProductThumbnail;\n","export const tableStyles = {\n btn: {\n marginTop: -4,\n marginRight: 4,\n padding: 2\n },\n btnIcon: {\n padding: 2\n },\n btnInfo: {\n position: 'absolute',\n top: 2,\n right: 4,\n padding: 2\n },\n inputCheckbox: {\n padding: 2\n },\n inputQty: {\n width: 90\n },\n message: {\n fontSize: 16,\n color: 'rgba(0, 0, 0, 0.54)'\n },\n messageError: {\n fontSize: 16,\n color: '#b4212d'\n },\n table: {},\n tHead: {},\n tBody: {},\n tr: {},\n trAdded: {\n backgroundColor: 'rgba(180, 220, 180, 0.3)'\n },\n trEditing: {\n backgroundColor: 'rgba(230, 230, 180, 0.3)'\n },\n th: {\n display: 'table-cell',\n position: 'relative',\n float: 'left',\n width: 'calc(100% - 24px)',\n textAlign: 'left',\n lineHeight: '1.2',\n verticalAlign: 'bottom'\n },\n thRight: {\n display: 'table-cell',\n position: 'relative',\n width: 'calc(100% - 24px)',\n textAlign: 'right',\n lineHeight: '1.2',\n verticalAlign: 'bottom'\n },\n td: {\n display: 'inline-block',\n position: 'relative',\n width: '100%',\n },\n tdName: {\n display: 'inline-block',\n position: 'relative',\n width: '100%',\n paddingRight: 34\n },\n tdRight: {\n display: 'inline-block',\n position: 'relative',\n width: '100%',\n textAlign: 'right'\n },\n tdSku: {\n display: 'inline-block',\n position: 'relative',\n width: '100%',\n whiteSpace: 'nowrap'\n }\n};\n","import React, {useEffect, useMemo, useState} from 'react';\nimport ListTable from './ListTable';\nimport OrderReceiptProductEditDialog from './OrderReceiptProductEditDialog';\nimport ProductDetailDialog from '../components/ProductDetailDialog';\nimport ProductThumbnail from \"./ProductThumbnail\";\nimport {isBlank} from '../utils/dataFunctions';\nimport {tableStyles} from '../global/tableStyles';\nimport {makeStyles} from '@material-ui/core/styles';\nimport EditIcon from '@material-ui/icons/Edit';\nimport IconButton from '@material-ui/core/IconButton';\nimport InfoIcon from '@material-ui/icons/Info';\n\nconst useStyles = makeStyles(tableStyles);\n\n/**\n * A component to display a filtered list of Products for an Order\n *\n * @param onEditFunc\n * @param fullItemList\n * @param filterName\n * @param filterSKU\n * @param filterTitleId\n * @param filterTypeId\n * @param excludeZeroQty\n * @return {JSX.Element}\n * @constructor\n */\nconst OrderItemsAvailableList = (\n {\n onEditFunc,\n fullItemList = [],\n filterName = null,\n filterSKU = null,\n filterTitleId = null,\n filterTypeId = null,\n excludeZeroQty = false\n }) => {\n\n const [filteredItemList, setFilteredItemList] = useState({\n list: []\n });\n\n const [itemDetailState, setItemDetailState] = useState({\n dialog: false,\n item: null\n });\n\n const [itemEditState, setItemEditState] = useState({\n dialog: false,\n item: null\n });\n\n useEffect(\n () => {\n const filterList = () => {\n let list = [];\n const nameFilter = (!isBlank(filterName)) ? filterName : null;\n const skuFilter = (!isBlank(filterSKU)) ? filterSKU : null;\n const titleId = (filterTitleId) ? parseInt(filterTitleId, 10) : null;\n const typeId = (filterTypeId) ? parseInt(filterTypeId, 10) : null;\n for (let i = 0; i < fullItemList.length; i++) {\n let add = true;\n const item = fullItemList[i];\n // If there is a Product Name to search, include only Product names with that string\n if (nameFilter && !item.title.toLowerCase().includes(nameFilter.toLowerCase())) {\n add = false;\n }\n // If there is a SKU to search, include only Products containing that SKU string\n if (skuFilter && !item.sku.toLowerCase().includes(skuFilter.toLowerCase())) {\n add = false;\n }\n // If there is a Title to filter by, include only Products of that Title\n if (titleId && titleId !== item.show_id) {\n add = false;\n }\n // If there is a Type to filter by, include only Products of that Type\n if (typeId && typeId !== item.type_id) {\n add = false;\n }\n if (excludeZeroQty && item.qty === 0) {\n add = false;\n }\n if (add) {\n list.push(item);\n }\n }\n // Set the list only if a filter exists\n setFilteredItemList({list: (nameFilter || skuFilter || titleId || typeId) ? list : []});\n };\n\n if (fullItemList || filterName || filterSKU || filterTitleId || filterTypeId) {\n filterList();\n }\n }, [fullItemList, filterName, filterSKU, filterTitleId, filterTypeId, excludeZeroQty]\n );\n\n // All Views: Handle event from Info button\n const handleInfoClick = (item) => {\n setItemDetailState({dialog: !!(item), item: item});\n };\n\n const handleCloseItemDialog = () => {\n setItemDetailState({dialog: false, item: null});\n };\n\n // All Views: Handle event from Edit Product button\n const handleEditClick = (item) => {\n setItemEditState({dialog: !!(item), item: item});\n };\n\n const handleSaveEditDialog = (e) => {\n let product = JSON.parse(JSON.stringify(e.product));\n product.qty_requested = e.qty_requested;\n let add = (e.qty_requested !== 0);\n setItemEditState({dialog: false, item: null});\n if (typeof onEditFunc === 'function') {\n onEditFunc({\n item: product,\n qty_requested: product.qty_requested,\n add: add\n });\n }\n };\n\n const handleCloseEditDialog = () => {\n setItemEditState({dialog: false, item: null});\n };\n\n const classes = useStyles();\n\n const tableColumns = useMemo(() => [\n {\n Header: () => (<span style={tableStyles.th}>SKU</span>),\n accessor: 'sku',\n sortType: 'basic',\n setRowState: ({row}) => (row.original.added) ? tableStyles.tr : tableStyles.trAdded,\n Cell: ({row}) => (\n <span style={tableStyles.td}>{(row.original.sku) ? row.original.sku : ''}</span>\n )\n },\n {\n Header: 'Image',\n id: 'thumb',\n Cell: ({row}) => <ProductThumbnail label=\"Image\" title={row.original.title}\n thumbnail={row.original.thumbnail}/>,\n disableFilters: true,\n disableSortBy: true\n },\n {\n Header: () => (<span style={tableStyles.th}>Title</span>),\n accessor: 'show_name',\n sortType: 'basic',\n Cell: ({row}) => (\n <span style={tableStyles.td}>{(row.original.show_name) ? row.original.show_name : ''}</span>\n )\n },\n {\n Header: () => (<span style={tableStyles.th}>Category</span>),\n accessor: 'type_name',\n sortType: 'basic',\n Cell: ({row}) => (\n <span style={tableStyles.td}>{(row.original.type_name) ? row.original.type_name : ''}</span>\n )\n },\n {\n Header: () => (<span style={tableStyles.th}>Product</span>),\n accessor: 'title',\n sortType: 'basic',\n Cell: ({row}) => (\n <span style={tableStyles.tdName}>\n {(row.original.title) ? row.original.title : ''}\n <IconButton\n aria-label=\"Info\"\n className={classes.btnInfo}\n onClick={() => handleInfoClick(row.original)}\n >\n <InfoIcon/>\n </IconButton>\n </span>\n )\n },\n {\n Header: () => (<span style={tableStyles.thRight}>Available<br/>Qty</span>),\n accessor: 'qty',\n sortType: 'basic',\n disableFilters: true,\n Cell: ({row}) => (\n <span style={tableStyles.tdRight}>{(row.original.qty) ? row.original.qty : '0'}</span>\n )\n },\n {\n Header: () => (<span style={tableStyles.thRight}>Requested<br/>Qty</span>),\n accessor: 'qty_requested',\n disableFilters: true,\n disableSortBy: true,\n Cell: ({row}) => (\n <span style={tableStyles.tdRight}>{(row.original.qty_requested) ? row.original.qty_requested : '0'}</span>\n )\n },\n {\n Header: () => (<span style={tableStyles.th}>Add</span>),\n id: 'add',\n disableFilters: true,\n disableSortBy: true,\n Cell: ({row}) => (\n <span style={tableStyles.tdName}>\n <IconButton\n aria-label=\"Add\"\n color=\"default\"\n className={classes.btnIcon}\n disabled={(row.original.qty === 0)}\n onClick={(row.original.qty === 0) ? undefined : () => handleEditClick(row.original)}\n >\n <EditIcon/>\n </IconButton>\n </span>\n )\n }\n ], [classes]);\n\n const tableData = useMemo(() => filteredItemList.list, [filteredItemList]);\n\n const listSort = {field: 'title', order: 'ASC'};\n\n const getRowStyle = (row) => {\n return (row.original && row.original.added) ? tableStyles.trAdded : tableStyles.tr;\n };\n\n return (\n <>\n {fullItemList.length > 0 &&\n <div className=\"order-item-list-container\">\n <ListTable\n data={tableData}\n columns={tableColumns}\n perPage={20}\n includePagination={true}\n loaded={true}\n sort={listSort}\n tableHeight={465}\n rowStyle={(row) => getRowStyle(row)}\n messageEmpty=\"Please filter or search to view Products.\"\n />\n <ProductDetailDialog\n openDialog={itemDetailState.dialog}\n productId={(itemDetailState.item) ? itemDetailState.item.id : null}\n onCloseFunc={handleCloseItemDialog}\n />\n <OrderReceiptProductEditDialog\n dialogType=\"order\"\n openDialog={itemEditState.dialog}\n product={(itemEditState.item) ? itemEditState.item : null}\n onSaveFunc={handleSaveEditDialog}\n onCloseFunc={handleCloseEditDialog}\n />\n </div>\n }\n </>\n )\n}\n\nexport default OrderItemsAvailableList;\n","import * as React from 'react';\n\n/**\n * Assemble an object with ID and display label for selection tables\n *\n * @param resource\n * @param item\n * @returns {{name: string, id: string}}\n */\nexport const assembleListObject = (resource, item) => {\n let obj = {id: '', name: ''};\n let firstLast = '';\n // Populate ID and display label depending on Resource\n switch (resource) {\n case 'Contact':\n obj.id = item.id;\n obj.name = item.name;\n firstLast = item.first_name + ' ' + item.last_name;\n if (item.name !== firstLast) {\n if (item.name !== '') {\n obj.name += ' - ';\n }\n obj.name += firstLast;\n }\n break;\n default:\n obj.id = item?.id ?? '';\n obj.name = item?.name ?? '';\n break;\n }\n return obj;\n};\n\n/* Column arrays for Lists and tables */\n\nexport const CLIENT_COLUMNS = [\n {\n Header: 'Name',\n accessor: 'name',\n sortType: 'basic',\n Cell: ({row}) => <span>{(row.original.name) ? row.original.name : ''}</span>\n }\n];\n\nexport const CONTACT_COLUMNS = [\n {\n Header: 'Company',\n accessor: 'name',\n sortType: 'basic',\n Cell: ({row}) => <span>{(row.original.name) ? row.original.name : ''}</span>\n },\n {\n Header: 'First Name',\n accessor: 'first_name',\n sortType: 'basic',\n Cell: ({row}) => <span>{(row.original.first_name) ? row.original.first_name : ''}</span>\n },\n {\n Header: 'Last Name',\n accessor: 'last_name',\n sortType: 'basic',\n Cell: ({row}) => <span>{(row.original.last_name) ? row.original.last_name : ''}</span>\n },\n {\n Header: 'Address',\n accessor: 'address',\n sortType: 'basic',\n Cell: ({row}) => <span>{(row.original.address) ? row.original.address : ''}</span>\n },\n {\n Header: 'Address 2',\n accessor: 'address2',\n sortType: 'basic',\n Cell: ({row}) => <span>{(row.original.address2) ? row.original.address2 : ''}</span>\n },\n {\n Header: 'City',\n accessor: 'city',\n sortType: 'basic',\n Cell: ({row}) => <span>{(row.original.city) ? row.original.city : ''}</span>\n },\n {\n Header: 'State',\n accessor: 'state',\n sortType: 'basic',\n Cell: ({row}) => <span>{(row.original.state) ? row.original.state : ''}</span>\n },\n {\n Header: 'ZIP',\n accessor: 'zip',\n sortType: 'basic',\n Cell: ({row}) => <span>{(row.original.zip) ? row.original.zip : ''}</span>\n },\n {\n Header: 'Country',\n accessor: 'country',\n sortType: 'basic',\n Cell: ({row}) => <span>{(row.original.country) ? row.original.country : ''}</span>\n }\n];\n\nexport const PRODUCT_TYPE_COLUMNS = [\n {\n Header: 'Parent Category',\n accessor: 'parent_type_name',\n sortType: 'basic',\n Cell: ({row}) => <span>{(row.original.parent_type_name) ? row.original.parent_type_name : ''}</span>\n },\n {\n Header: 'Category',\n accessor: 'name',\n sortType: 'basic',\n Cell: ({row}) => <span>{(row.original.name) ? row.original.name : ''}</span>\n },\n {Header: 'Description', accessor: 'description', sortType: 'basic'}\n];\n\nexport const SHIPPING_COMPANY_COLUMNS = [\n {\n Header: 'Name',\n accessor: 'name',\n sortType: 'basic',\n disableFilters: true,\n Cell: ({row}) => <span>{row.original.name}</span>\n }\n];\n\nexport const SHIPPING_METHOD_COLUMNS = [\n {\n Header: 'Name',\n accessor: 'name',\n sortType: 'basic',\n disableFilters: true,\n Cell: ({row}) => <span>{row.original.name}</span>\n }\n];\n\nexport const TITLE_COLUMNS = [\n {\n Header: 'Client',\n accessor: 'org_name',\n sortType: 'basic',\n Cell: ({row}) => <span>{(row.original.org_name) ? row.original.org_name : ''}</span>\n },\n {\n Header: 'Name',\n accessor: 'name',\n sortType: 'basic',\n Cell: ({row}) => <span>{(row.original.name) ? row.original.name : ''}</span>\n }\n];\n\nexport const TITLE_BY_ORG_COLUMNS = [\n {\n Header: 'Name',\n accessor: 'name',\n sortType: 'basic',\n Cell: ({row}) => <span>{(row.original.name) ? row.original.name : ''}</span>\n }\n];\n","import React, {useCallback, useEffect, useState} from 'react';\nimport axios from 'axios';\nimport {RESOURCES as baseResources} from '../resources';\nimport {postProcessData} from '../dataProviderPostProcess';\nimport {getGetHeaders} from '../utils/headers';\nimport ListLoading from './ListLoading';\nimport ListTable from './ListTable';\nimport Dialog from '@material-ui/core/Dialog';\nimport MuiDialogTitle from '@material-ui/core/DialogTitle';\nimport MuiDialogContent from '@material-ui/core/DialogContent';\nimport {\n assembleListObject,\n CONTACT_COLUMNS,\n TITLE_COLUMNS,\n TITLE_BY_ORG_COLUMNS,\n SHIPPING_COMPANY_COLUMNS,\n SHIPPING_METHOD_COLUMNS,\n PRODUCT_TYPE_COLUMNS,\n CLIENT_COLUMNS\n} from '../global/listColumns';\nimport {makeStyles} from '@material-ui/core/styles';\nimport Button from '@material-ui/core/Button';\nimport IconButton from '@material-ui/core/IconButton';\nimport CloseIcon from '@material-ui/icons/Close';\nimport Typography from '@material-ui/core/Typography';\n\nconst useDialogStyles = makeStyles({\n root: {\n margin: 0,\n padding: 12,\n width: '100%'\n },\n closeButton: {\n position: 'absolute',\n right: 10,\n top: 8,\n color: '#666666',\n },\n paper: {\n minHeight: 200\n }\n});\n\n/**\n * A Material UI Dialog to retrieve and display a table of items for selection\n *\n * @param itemPlural\n * @param listLabel\n * @param listSort\n * @param openDialog\n * @param resourceName\n * @param onCloseFunc\n * @param onSelectFunc\n * @param listFilters\n * @param refresh\n * @returns {JSX.Element}\n * @constructor\n */\nconst SelectFromListDialog = (\n {\n itemPlural,\n listLabel,\n listSort,\n openDialog,\n resourceName,\n onCloseFunc,\n onSelectFunc,\n listFilters = {active: true},\n refresh = false\n }) => {\n\n const [columns, setColumns] = useState([]);\n const [list, setList] = useState([]);\n const [loading, setLoading] = useState(false);\n const [filterObject, setFilterObject] = useState(null);\n const [open, setOpen] = useState(false);\n\n // Callback: Set React-Table columns for intended Resource\n const setTableColumns = useCallback(() => {\n let columnArray = [];\n if (resourceName === 'Contact') {\n columnArray = [...CONTACT_COLUMNS];\n }\n if (resourceName === 'Organization') {\n columnArray = [...CLIENT_COLUMNS];\n }\n if (resourceName === 'ProductType' || resourceName === 'ParentProductType' || resourceName === 'ChildProductType') {\n columnArray = [...PRODUCT_TYPE_COLUMNS];\n }\n if (resourceName === 'ShippingCompany') {\n columnArray = [...SHIPPING_COMPANY_COLUMNS];\n }\n if (resourceName === 'ShippingMethod') {\n columnArray = [...SHIPPING_METHOD_COLUMNS];\n }\n if (resourceName === 'Show') {\n columnArray = [...TITLE_COLUMNS];\n }\n if (resourceName === 'ShowByOrg') {\n columnArray = [...TITLE_BY_ORG_COLUMNS];\n }\n\n // Add a Select button onto each row\n const selectButtonColumn = selectButtonColumnObject();\n columnArray.push(selectButtonColumn);\n setColumns(columnArray);\n }, [resourceName]); // eslint-disable-line react-hooks/exhaustive-deps\n\n // Callback: Get list\n const getItemList = useCallback(() => {\n let cfg = baseResources[resourceName].GET_LIST(listFilters);\n\n axios({\n method: cfg.method,\n url: cfg.uri,\n headers: getGetHeaders()\n })\n .then((response) => {\n if (response.data) {\n // Post-process the data as if a List view\n const rdata = postProcessData(resourceName, 'GET_LIST', {}, response);\n setList(rdata.data);\n }\n })\n .catch((err) => {\n console.log('Error retrieving ' + itemPlural + ': ', err);\n })\n .finally(() => {\n setFilterObject(listFilters);\n setLoading(false);\n });\n }, [itemPlural, listFilters, resourceName]);\n\n // Effect: Get new list when directed to open or refresh\n useEffect(\n () => {\n const getList = () => {\n setOpen(true);\n // If filters change (such as an Org ID) or if the table should refresh, fetch data\n if (\n JSON.stringify(filterObject) !== JSON.stringify(listFilters) ||\n refresh === true\n ) {\n setColumns([]);\n setList([]);\n setLoading(true);\n setTableColumns();\n getItemList();\n }\n };\n if (openDialog) {\n return getList();\n }\n\n }, [filterObject, listFilters, openDialog, refresh, resourceName, getItemList, setTableColumns]\n );\n\n // Create a Select button for each row\n const selectButtonColumnObject = (row) => {\n return {\n Header: () => null,\n id: 'list-select',\n Cell: ({row}) => {\n return (\n <Button\n variant=\"outlined\"\n color=\"primary\"\n size=\"small\"\n onClick={() => handleSelectClick(row.original)}\n >\n Select\n </Button>\n )\n },\n width: 180,\n maxWidth: 180,\n disableFilters: true,\n disableSortBy: true\n }\n };\n\n // Handle table row selection\n const handleSelectClick = (row) => {\n // Populate the object's ID and display label\n let obj = assembleListObject(resourceName, row);\n\n if (typeof onSelectFunc === 'function') {\n onSelectFunc(obj);\n handleClose();\n }\n };\n\n // Handle dialog closure\n const handleClose = () => {\n setOpen(false);\n if (typeof onCloseFunc === 'function') {\n onCloseFunc();\n }\n };\n\n const classes = useDialogStyles();\n\n return (\n <>\n <Dialog\n onClose={handleClose}\n aria-labelledby=\"Select-From-Listing-Dialog\"\n open={open}\n maxWidth={false}\n fullWidth={true}\n transitionDuration={{\n enter: 100,\n exit: 150\n }}\n >\n <MuiDialogTitle disableTypography className={classes.root}>\n <Typography variant=\"h6\">\n {listLabel &&\n <>\n {listLabel}\n </>\n }\n </Typography>\n <IconButton\n aria-label=\"close\"\n className={classes.closeButton}\n onClick={handleClose}\n tabIndex=\"-1\"\n >\n <CloseIcon/>\n </IconButton>\n </MuiDialogTitle>\n <MuiDialogContent dividers className={classes.paper}>\n {loading &&\n <ListLoading/>\n }\n {columns && !loading &&\n <div className=\"show-modal\">\n <ListTable\n data={list}\n columns={columns}\n perPage={12}\n includePagination={true}\n loaded={true}\n sort={listSort}\n focusOnLoad={true}\n messageEmpty={`No ${itemPlural} found.`}\n />\n </div>\n }\n </MuiDialogContent>\n </Dialog>\n </>\n )\n};\n\nexport default SelectFromListDialog;\n","import React, {useCallback, useEffect, useRef, useState} from 'react';\nimport {Field, useForm} from 'react-final-form';\nimport SelectFromListDialog from './SelectFromListDialog';\nimport HighlightOffIcon from '@material-ui/icons/HighlightOff';\nimport {InputAdornment} from '@material-ui/core';\nimport TextField from '@material-ui/core/TextField';\n\n/**\n * A component to display a field to launch a list selection component\n *\n * @param disabled\n * @param fieldValue\n * @param isRequired\n * @param resourceName\n * @param source\n * @param onChangeFunc\n * @param hasClear\n * @param error\n * @param errorText\n * @param inAdminForm\n * @param itemPlural\n * @param listFilters\n * @param listLabel\n * @param listSort\n * @param refresh\n * @param returnType\n * @param selectedObject\n * @param size\n * @param className\n * @returns {JSX.Element}\n * @constructor\n */\nconst SelectFromListInput = (\n {\n disabled,\n fieldValue,\n isRequired,\n resourceName,\n source,\n onChangeFunc,\n hasClear = true,\n error = false,\n errorText = '',\n inAdminForm = false,\n itemPlural = 'Items',\n listFilters = {active: true},\n listLabel = '',\n listSort = {field: 'name', order: 'ASC'},\n refresh = false,\n returnType = 'object',\n selectedObject = {id: '', name: ''},\n size = 'small',\n className = \"input-block input-400\"\n }) => {\n\n const filterForm = useForm();\n const mounted = useRef(false);\n\n const [open, setOpen] = useState(false);\n const [valueObject, setValueObject] = useState(selectedObject);\n\n // Callback: Populate field with new item\n const selectNewItem = useCallback((item) => {\n if (mounted.current === true) {\n setValueObject({id: item.id, name: item.name});\n const returnValue = (returnType === 'string') ? item.id : item;\n if (inAdminForm) {\n filterForm.change(source, returnValue);\n }\n }\n\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n // Effect: A new item has been passed to this component\n useEffect(() => {\n mounted.current = true;\n\n if (selectedObject.id !== '') {\n selectNewItem(selectedObject);\n }\n\n return () => {\n mounted.current = false;\n };\n }, [selectedObject, selectNewItem]);\n\n const handleClickToSelect = (e) => {\n setOpen(true);\n };\n\n const handleItemSelected = (e) => {\n setValueObject({id: e.id, name: e.name});\n const returnValue = (returnType === 'string') ? e.id : e;\n if (inAdminForm) {\n filterForm.change(source, returnValue);\n }\n if (typeof onChangeFunc === 'function') {\n onChangeFunc(returnValue);\n }\n };\n\n const handleClearSelected = (e) => {\n setValueObject({id: '', name: ''});\n if (inAdminForm) {\n filterForm.change(source, '');\n }\n if (typeof onChangeFunc === 'function') {\n onChangeFunc(null);\n }\n e.preventDefault();\n e.stopPropagation();\n };\n\n const handleClose = () => {\n setOpen(false);\n };\n\n return (\n <>\n <span className={className}>\n <TextField\n type=\"text\"\n variant=\"filled\"\n size={size}\n id={`select-from-list-input-${resourceName}`}\n label={listLabel}\n value={valueObject.name}\n onClick={(e) => (!disabled) ? handleClickToSelect(e) : undefined}\n disabled={disabled}\n required={isRequired}\n fullWidth={true}\n error={(error)}\n helperText={(errorText !== '') ? errorText: undefined}\n InputProps={{\n endAdornment: (\n (hasClear && valueObject.name) ?\n <InputAdornment\n position=\"end\"\n onClick={(e) => handleClearSelected(e)}\n style={{zIndex: 10, cursor: 'pointer', color: 'rgba(0,0,0,0.7)'}}\n >\n <HighlightOffIcon/>\n </InputAdornment>\n : null\n ),\n // onClick: (e) => (!disabled) ? handleClickToSelect(e) : undefined\n }}\n />\n </span>\n <SelectFromListDialog\n itemPlural={itemPlural}\n listFilters={listFilters}\n listLabel={listLabel}\n listSort={listSort}\n openDialog={open}\n resourceName={resourceName}\n refresh={refresh}\n onSelectFunc={(e) => handleItemSelected(e)}\n onCloseFunc={() => handleClose()}\n />\n {inAdminForm &&\n <Field name={source}>\n {props => (\n <TextField\n id={source}\n name={source}\n label=\"\"\n value={valueObject.id}\n className=\"input-hidden\"\n disabled={true}\n error={(error)}\n />\n )}\n </Field>\n }\n </>\n );\n}\n\nexport default SelectFromListInput;\n","import React, {useEffect, useState} from 'react';\nimport {Form} from 'react-final-form';\nimport axios from 'axios';\nimport {\n TextInput\n} from 'react-admin';\nimport {RESOURCES as resources} from '../resources';\nimport {getPostHeaders} from '../utils/headers';\nimport FieldDescription from './FieldDescription';\nimport FieldDivider from './FieldDivider';\nimport {useDialogStyles, useLoadingStyles} from '../global/dialogStyles';\nimport {viewStyles} from '../global/styles';\nimport CircularProgress from '@material-ui/core/CircularProgress';\nimport Dialog from '@material-ui/core/Dialog';\nimport MuiDialogTitle from '@material-ui/core/DialogTitle';\nimport MuiDialogContent from '@material-ui/core/DialogContent';\nimport Button from '@material-ui/core/Button';\nimport IconButton from '@material-ui/core/IconButton';\nimport CloseIcon from '@material-ui/icons/Close';\nimport Typography from '@material-ui/core/Typography';\n\n/**\n * A Material UI Dialog to display a Title Create form\n *\n * @param openDialog\n * @param onCloseFunc\n * @param onCompleteFunc\n * @param selectedOrgId\n * @param success\n * @returns {JSX.Element}\n * @constructor\n */\nconst TitleCreateDialog = (\n {\n openDialog,\n onCloseFunc,\n onCompleteFunc,\n selectedOrgId,\n success\n }) => {\n\n const [open, setOpen] = useState(false);\n const [submitting, setSubmitting] = useState(false);\n const [formMessage, setFormMessage] = useState({\n error: false,\n message: null\n });\n\n // Effect: Open dialog from parent\n useEffect(() => {\n return setOpen(openDialog);\n }, [openDialog]);\n\n const validateForm = (values) => {\n return !(\n !values.new_title_name\n );\n };\n\n const handleSubmit = (values) => {\n const formValues = {\n name: values?.new_title_name ?? '',\n org_id: (selectedOrgId) ? selectedOrgId : ''\n };\n let errorMessage = 'Sorry, there was an error creating this Title.';\n const resource = resources.Show.CREATE(formValues);\n setSubmitting(true);\n axios({\n method: resource.method,\n url: resource.uri,\n data: formValues,\n headers: getPostHeaders(true)\n }).then((response) => {\n if (response.data && response.data.id) {\n setSubmitting(false);\n\n // Complete creation\n if (typeof onCompleteFunc === 'function') {\n onCompleteFunc(response.data);\n }\n if (!response.data) {\n setFormMessage({\n error: true,\n message: errorMessage\n });\n } else {\n setFormMessage({\n error: false,\n message: 'Title created.'\n });\n }\n setTimeout(() => {\n handleClose(null);\n }, 1000);\n } else {\n setSubmitting(false);\n setFormMessage({\n error: true,\n message: errorMessage\n });\n }\n }).catch((error) => {\n if (error.response) {\n // Server response outside 2xx\n } else if (error.request) {\n // No response\n }\n setSubmitting(false);\n setFormMessage({\n error: true,\n message: errorMessage\n });\n });\n };\n\n const handleClose = () => {\n setOpen(false);\n if (typeof onCloseFunc === 'function') {\n onCloseFunc();\n }\n };\n\n const classes = useDialogStyles();\n const loadingClasses = useLoadingStyles();\n\n return (\n <>\n <Dialog\n fullWidth\n maxWidth={false}\n onClose={handleClose}\n aria-labelledby=\"Product-Create\"\n open={open}\n className={classes.root}\n transitionDuration={{\n enter: 100,\n exit: 150\n }}\n >\n <MuiDialogTitle disableTypography className={classes.title}>\n <Typography variant=\"h6\">\n Create Title\n </Typography>\n <IconButton aria-label=\"close\" className={classes.closeButton} onClick={handleClose}>\n <CloseIcon/>\n </IconButton>\n </MuiDialogTitle>\n <MuiDialogContent dividers>\n <Form\n onSubmit={handleSubmit}\n mutators={{\n setValue: ([field, value], state, {changeValue}) => {\n changeValue(state, field, () => value)\n }\n }}\n render={({form, handleSubmit, values}) => {\n return (\n <form onSubmit={handleSubmit}>\n <FieldDescription\n instructions={true} marginBottom={true}\n text='Add a Title by adding a Name.'\n />\n <TextInput label=\"Name of Title\"\n source=\"new_title_name\"\n multiline fullWidth={true}/>\n <FieldDivider type=\"break\" margin=\"bottom\"/>\n\n <FieldDescription\n marginBottom={true}\n description={true}\n text=\"After clicking Create Title, this Title should be available to select.\"\n />\n <hr style={viewStyles.break}/>\n <Button\n type=\"button\"\n variant=\"contained\"\n color=\"primary\"\n style={viewStyles.buttonInline}\n disabled={(validateForm(values) === false || submitting || success)}\n onClick={() => handleSubmit()}\n >\n Create Title\n </Button>\n <Button\n type=\"button\"\n variant=\"contained\"\n style={viewStyles.buttonInline}\n disabled={(submitting || success)}\n onClick={() => handleClose()}\n >\n Cancel\n </Button>\n {submitting &&\n <>\n <CircularProgress size={30} className={loadingClasses.root}/>\n <p className={loadingClasses.text}>Creating Title...</p>\n </>\n }\n {formMessage.message &&\n <p className={(formMessage.error) ? loadingClasses.textError : loadingClasses.text}>\n {formMessage.message}\n </p>\n }\n </form>\n )\n }}\n >\n </Form>\n </MuiDialogContent>\n </Dialog>\n </>\n )\n};\n\nexport default TitleCreateDialog;\n","import React, {Component} from 'react';\nimport PropTypes from 'prop-types';\nimport SelectFromListInput from './SelectFromListInput';\nimport TitleCreateDialog from './TitleCreateDialog';\nimport Button from '@material-ui/core/Button';\n\nconst btnStyles = {\n addNewButton: {\n display: 'inline-block',\n margin: '5px 0 1em 0'\n }\n};\n\nclass OrgShowSelectFromListInput extends Component {\n constructor(props) {\n super(props);\n const selectedOrg = (this.props.selectedOrg) ? this.props.selectedOrg : null;\n const selectedOrgId = (this.props.selectedOrgId) ? this.props.selectedOrgId : '';\n this.state = {\n createTitleDialogOpen: false,\n selectedOrg: selectedOrg,\n selectedOrgId: selectedOrgId,\n selectedShow: null,\n selectedShowId: '',\n showChoicesAll: [],\n showChoicesFiltered: [],\n };\n }\n\n static getDerivedStateFromProps(nextProps, prevState) {\n let updateOrg = false;\n let updateOrgId = false;\n let org = prevState.selectedOrg;\n let orgId = prevState.selectedOrgId;\n if (nextProps.selectedOrg && nextProps.selectedOrg !== prevState.selectedOrg) {\n updateOrg = true;\n org = nextProps.selectedOrg;\n }\n if (nextProps.selectedOrgId && nextProps.selectedOrgId !== prevState.selectedOrgId) {\n updateOrgId = true;\n orgId = nextProps.selectedOrgId;\n }\n if (updateOrg || updateOrgId) {\n return {\n selectedOrg: org,\n selectedOrgId: orgId\n }\n }\n return null;\n }\n\n componentDidUpdate(prevProps, prevState, snapshot) {\n if (this.props.selectedOrgId && this.props.selectedOrgId !== prevProps.selectedOrgId) {\n this.handleOrgSelect(this.props.selectedOrgId);\n }\n }\n\n handleOrgSelect = (value) => {\n this.setState({\n selectedOrgId: value,\n selectedShowId: ''\n }, () => {\n const onSelectOrg = this.props.onSelectOrg;\n if (typeof onSelectOrg === 'function') {\n onSelectOrg(value);\n }\n });\n };\n\n handleShowSelect = (value) => {\n this.setState({\n selectedShowId: value\n }, () => {\n const onSelectShow = this.props.onSelectShow;\n if (typeof onSelectShow === 'function') {\n onSelectShow(value);\n }\n });\n };\n\n handleTitleCreated = (item) => {\n if (item.id) {\n this.setState({\n selectedShow: item,\n selectedShowId: item.id\n }, () => {\n const onSelectShow = this.props.onSelectShow;\n if (typeof onSelectShow === 'function') {\n onSelectShow(item.id);\n }\n });\n }\n };\n\n displayCreateTitleDialog = (open) => {\n this.setState({\n createTitleDialogOpen: open\n });\n };\n\n render() {\n const {\n includeTitleCreation,\n inline,\n isRequired,\n orgLabel,\n orgSrc,\n selectOrg,\n showLabel,\n showSrc\n } = this.props;\n\n const {\n createTitleDialogOpen,\n selectedOrg,\n selectedOrgId,\n selectedShow\n } = this.state;\n\n let newTitle = 'Create New Title';\n if (selectedOrg && selectedOrg.name) {\n newTitle += ' for ' + selectedOrg.name;\n }\n\n const inputClass = (inline)\n ? 'input-inline third'\n : '';\n\n return (\n <>\n {selectOrg &&\n <SelectFromListInput\n inAdminForm={true}\n source={orgSrc}\n resourceName=\"Organization\"\n listLabel={orgLabel}\n itemPlural=\"Clients\"\n listFilters={{\n active: true\n }}\n className={inputClass}\n isRequired={isRequired}\n returnType=\"string\"\n onChangeFunc={value => this.handleOrgSelect(value)}\n />\n }\n <SelectFromListInput\n inAdminForm={true}\n source={showSrc}\n resourceName=\"ShowByOrg\"\n selectedObject={(selectedShow)\n ? {id: selectedShow.id, name: selectedShow.name}\n : undefined}\n listLabel={showLabel}\n itemPlural=\"Titles\"\n listFilters={{\n active: true,\n org_id: selectedOrgId\n }}\n className={inputClass}\n isRequired={isRequired}\n disabled={(!selectedOrgId)}\n returnType=\"string\"\n refresh={true}\n onChangeFunc={value => this.handleShowSelect(value)}\n />\n {includeTitleCreation &&\n <>\n <Button\n variant=\"contained\"\n color=\"default\"\n onClick={() => this.displayCreateTitleDialog(true)}\n style={btnStyles.addNewButton}\n disabled={(!selectedOrgId)}\n >\n {newTitle}\n </Button>\n <TitleCreateDialog\n selectedOrgId={selectedOrgId}\n openDialog={createTitleDialogOpen}\n onCompleteFunc={(e) => this.handleTitleCreated(e)}\n onCloseFunc={() => this.displayCreateTitleDialog(false)}\n />\n </>\n }\n </>\n );\n }\n}\n\nOrgShowSelectFromListInput.propTypes = {\n addLabel: PropTypes.bool,\n includeTitleCreation: PropTypes.bool,\n inline: PropTypes.bool,\n isRequired: PropTypes.bool,\n onSelectOrg: PropTypes.func,\n onSelectShow: PropTypes.func,\n orgLabel: PropTypes.string,\n orgSrc: PropTypes.string,\n selectOrg: PropTypes.bool,\n selectedOrg: PropTypes.object,\n selectedOrgId: PropTypes.any,\n showLabel: PropTypes.string,\n showSrc: PropTypes.string,\n};\n\nOrgShowSelectFromListInput.defaultProps = {\n addLabel: true,\n includeTitleCreation: false,\n inline: true,\n isRequired: false,\n orgLabel: 'Select a Client',\n orgSource: 'selected_org_id',\n selectOrg: true,\n selectedOrg: null,\n selectedOrgId: '',\n showLabel: 'Select a Title',\n showSource: 'selected_show_id'\n};\n\nexport default OrgShowSelectFromListInput;\n","import React, {useCallback, useEffect, useState} from 'react';\nimport axios from 'axios';\nimport {RESOURCES as resources} from '../productResources';\nimport {getGetHeaders} from '../utils/headers';\nimport OrderItemsAvailableList from './OrderItemsAvailableList';\nimport {TextInput} from 'react-admin';\nimport OrgShowSelectFromListInput from \"./OrgShowSelectFromListInput\";\nimport SelectFromListInput from \"./SelectFromListInput\";\nimport FieldDivider from \"./FieldDivider\";\n\n/**\n * A component for retrieving and displaying a Product List by Order ID\n *\n * @param orderId\n * @param orgId\n * @param displayFields\n * @param onProductAdjust\n * @param productToUpdate\n * @param refreshList\n * @param updateList\n * @param props\n * @return {JSX.Element}\n * @constructor\n */\nconst OrderItemsAvailableListContainer = (\n {\n orderId,\n orgId,\n displayFields,\n onProductAdjust,\n productToUpdate,\n refreshList = false,\n updateList = false,\n ...props\n }) => {\n\n const [currentOrgId, setCurrentOrgId] = useState(null);\n const [itemList, setItemList] = useState({\n list: []\n });\n const [filterName, setFilterName] = useState(null);\n const [filterNameValue, setFilterNameValue] = useState(null);\n const [filterSKU, setFilterSKU] = useState(null);\n const [filterSKUValue, setFilterSKUValue] = useState(null);\n const [filterTitleId, setFilterTitleId] = useState(null);\n const [filterTypeId, setFilterTypeId] = useState(null);\n const [updateComplete, setUpdateComplete] = useState(false);\n const [updateProductComplete, setUpdateProductComplete] = useState(false);\n\n // Callback: Retrieve list of Products\n const getItemList = useCallback(() => {\n return JSON.parse(JSON.stringify(itemList.list));\n }, [itemList]);\n\n // Effect: Fetch all Products by Org ID\n useEffect(\n () => {\n if (orgId && !updateComplete && displayFields) {\n setCurrentOrgId(orgId);\n const fetchItems = () => {\n const params = {\n active: true,\n id: orgId\n };\n\n const cfg = resources.ProductsByOrg.GET_LIST(params);\n axios({\n method: 'GET',\n url: cfg.uri,\n headers: getGetHeaders(),\n maxBodyLength: Infinity,\n maxContentLength: Infinity\n }).then((response) => {\n if (response.data && response.data.length > 0) {\n processItems(response.data);\n }\n // resolve(response);\n }).catch((error) => {\n console.log('error response for Products: ', error);\n if (error.response) {\n // Server response outside 2xx\n } else if (error.request) {\n // No response\n }\n });\n };\n\n const processItems = (data) => {\n let list = [];\n if (data && data.length > 0) {\n for (let i = 0; i < data.length; i++) {\n const item = data[i];\n // Portal excludes 0-qty Products\n if (item.qty > 0) {\n const itemToAdd = {\n active: item.active,\n added: false,\n id: item.id,\n org_id: item.org_id,\n org_name: item.org_name,\n qty: item.qty,\n qty_available: (item.qty >= 0) ? item.qty : 0,\n qty_requested: 0,\n show_id: item.show_id,\n show_name: item.show_name,\n sku: item.sku,\n thumbnail: item.thumbnail,\n title: item.title,\n type_id: item.type_id,\n type_name: item.type_name\n };\n list.push(itemToAdd);\n }\n }\n }\n // Store a complete list of Products\n setItemList({list: list});\n setUpdateComplete(true);\n };\n\n // If an Org ID becomes available or has changed, or if a refresh is needed, fetch Products\n if (orgId || !updateComplete) {\n fetchItems();\n }\n }\n\n }, [orgId, displayFields, updateComplete]\n );\n\n // Effect: Update a Product's qty edited outside this component\n useEffect(() => {\n const updateProductQty = () => {\n let list = getItemList();\n const idx = list.findIndex(r => r.id === productToUpdate.id);\n if (idx !== -1) {\n list[idx].qty_requested = productToUpdate.qty_requested;\n list[idx].added = (list[idx].qty_requested !== 0);\n setItemList({list: list});\n }\n setUpdateProductComplete(true);\n };\n if (!updateProductComplete) {\n updateProductQty();\n }\n }, [getItemList, productToUpdate, updateProductComplete]);\n\n // Effect: Update if another component has edited a requested Product Qty\n useEffect(() => {\n if (updateList && productToUpdate) {\n setUpdateProductComplete(false);\n }\n }, [productToUpdate, updateList]);\n\n // Effect: Refresh if Org ID is changed or list should refresh\n useEffect(\n () => {\n if ((orgId !== currentOrgId) || refreshList) {\n setUpdateComplete(false);\n }\n\n }, [orgId, currentOrgId, refreshList, updateComplete]\n );\n\n // Effect: Debounce SKU input\n useEffect(() => {\n const updateFilterSKU = setTimeout(() => {\n setFilterSKUValue(filterSKU);\n }, 1000);\n\n return () => clearTimeout(updateFilterSKU);\n\n }, [filterSKU]);\n\n // Effect: Debounce Title input\n useEffect(() => {\n const updateFilterName = setTimeout(() => {\n setFilterNameValue(filterName);\n }, 1000);\n\n return () => clearTimeout(updateFilterName);\n\n }, [filterName]);\n\n const blurFilter = () => {\n const active = document.activeElement;\n if (active) {\n active.blur();\n }\n };\n\n const handleSearchNameSKUFilter = (type, e) => {\n let val = e?.currentTarget?.value ?? null;\n if (type === 'name') {\n setFilterName(val);\n }\n if (type === 'sku') {\n setFilterSKU(val);\n }\n };\n\n const handleSelectTitleFilter = (e) => {\n let id = (e) ? e : null;\n setFilterTitleId(id);\n blurFilter();\n };\n\n const handleSelectTypeFilter = (e) => {\n let id = (e) ? e : null;\n setFilterTypeId(id);\n blurFilter();\n };\n\n /**\n * Handle add/remove/update event from Available List\n *\n * @param e\n */\n const handleAddChange = (e) => {\n let list = JSON.parse(JSON.stringify(itemList.list));\n const idx = list.findIndex(r => r.id === e.item.id);\n if (idx !== -1) {\n // Update the Product's requested Qty\n list[idx].qty_requested = parseInt(e.qty_requested, 10);\n\n // If the Product is to be added or removed, or the quantity is 0, update the row\n list[idx].added = (list[idx].qty_requested !== 0);\n\n // Update this available list\n setItemList({list: list});\n\n // Notify the form that this item is to be added or removed on this Order\n const item = JSON.parse(JSON.stringify(list[idx]));\n item.product_id = item.id;\n item.qty_requested = list[idx].qty_requested;\n item.submitted = false;\n if (typeof onProductAdjust === 'function') {\n onProductAdjust({item: item, add: item.added});\n }\n }\n };\n\n return (\n <>\n <div className=\"order-items-filter\">\n <OrgShowSelectFromListInput\n selectOrg={!orgId}\n selectedOrgId={orgId}\n orgLabel=\"Select a Client\"\n orgSrc=\"order_items_filter_org_id\"\n showLabel=\"Filter Products by Title\"\n showSrc=\"order_items_filter_show_id\"\n addLabel={false}\n inline={true}\n className=\"input-inline third\"\n onSelectShow={(e) => handleSelectTitleFilter(e)}\n />\n <SelectFromListInput\n inAdminForm={true}\n source=\"filter_product_type_id\"\n resourceName=\"ProductType\"\n listLabel=\"Filter Products by Category\"\n itemPlural=\"ProductType\"\n listFilters={{\n active: true\n }}\n className=\"input-inline third\"\n isRequired={true}\n returnType=\"string\"\n onChangeFunc={(e) => handleSelectTypeFilter(e)}\n />\n <FieldDivider type=\"break\" margin=\"bottom\"/>\n <TextInput\n key=\"filter_product_sku\"\n label=\"Search Product SKU\"\n source=\"filter_product_sku\"\n placeholder=\"SKU-N00012345\"\n onChange={(e) => handleSearchNameSKUFilter('sku', e)}\n className=\"input-inline third\"\n />\n <TextInput\n key=\"filter_product_title\"\n label=\"Search Product Name\"\n source=\"filter_product_title\"\n alwaysOn\n onChange={(e) => handleSearchNameSKUFilter('name', e)}\n className=\"input-inline third\"\n />\n <FieldDivider type=\"break\"/>\n </div>\n <OrderItemsAvailableList\n fullItemList={itemList.list}\n filterName={filterNameValue}\n filterSKU={filterSKUValue}\n filterTitleId={filterTitleId}\n filterTypeId={filterTypeId}\n excludeZeroQty={false}\n onEditFunc={(e) => handleAddChange(e)}\n />\n </>\n );\n}\n\nexport default OrderItemsAvailableListContainer;\n","import React, {useEffect, useState} from 'react';\nimport axios from 'axios';\nimport {RESOURCES as resources} from '../productResources';\nimport {getGetHeaders} from '../utils/headers';\nimport ProductDetailDialog from '../components/ProductDetailDialog';\nimport {makeStyles} from '@material-ui/core/styles';\nimport Button from '@material-ui/core/Button';\nimport IconButton from '@material-ui/core/IconButton';\nimport Table from '@material-ui/core/Table';\nimport TableBody from '@material-ui/core/TableBody';\nimport TableCell from '@material-ui/core/TableCell';\nimport TableHead from '@material-ui/core/TableHead';\nimport TableRow from '@material-ui/core/TableRow';\nimport TextField from '@material-ui/core/TextField';\nimport CloseIcon from '@material-ui/icons/Close';\nimport EditIcon from '@material-ui/icons/Edit';\nimport InfoIcon from '@material-ui/icons/Info';\nimport RemoveCircleOutlineIcon from '@material-ui/icons/RemoveCircleOutline';\nimport SaveIcon from '@material-ui/icons/Save';\n\nconst useStyles = makeStyles({\n btn: {\n marginTop: -4,\n marginRight: 4,\n padding: 2\n },\n btnInfo: {\n position: 'absolute',\n top: 2,\n right: 4,\n padding: 2\n },\n btnText: {\n marginRight: 6,\n padding: '0px 10px'\n },\n message: {\n fontSize: 16,\n color: 'rgba(0, 0, 0, 0.54)'\n },\n messageError: {\n fontSize: 16,\n color: '#b4212d'\n },\n saving: {\n color: 'rgba(0, 0, 0, 0.54)'\n },\n table: {},\n tHead: {},\n tBody: {},\n tr: {},\n th: {\n lineHeight: '1.2',\n verticalAlign: 'bottom'\n },\n td: {\n position: 'relative',\n padding: '5px 16px 5px 16px'\n },\n tdName: {\n position: 'relative',\n padding: '5px 36px 5px 16px'\n }\n});\n\n/**\n * A component to display a list of Products for an Order\n *\n * @param onEditQtyFunc\n * @param onRemoveFunc\n * @param itemList\n * @param hasEditQty\n * @param hasRemove\n * @param saving\n * @param error\n * @return {JSX.Element}\n * @constructor\n */\nconst OrderItemsList = ({\n onEditQtyFunc,\n onRemoveFunc,\n itemList = [],\n hasEditQty = false,\n hasRemove = true,\n saving = false,\n error = null\n }) => {\n\n const [currentItem, setCurrentItem] = useState(null);\n const [currentItemId, setCurrentItemId] = useState(null);\n const [qty, setQty] = useState(-1);\n const [availableQty, setAvailableQty] = useState(0);\n const [newQty, setNewQty] = useState(-1);\n const [saveRequest, setSaveRequest] = useState(false);\n const [saveMessage, setSaveMessage] = useState({\n error: false,\n message: ''\n });\n const [itemDetailState, setItemDetailState] = useState({\n dialog: false,\n item: null\n });\n\n // Effect: Fetch Product by ID\n useEffect(\n () => {\n if (currentItem && currentItem.product_id) {\n const fetchItem = () => {\n const cfg = resources.Product.GET_ONE({id: currentItem.product_id});\n axios({\n method: 'GET',\n url: cfg.uri,\n headers: getGetHeaders()\n }).then((response) => {\n if (response.data && response.data.qty) {\n // Set the maximum Quantity to request for this Product\n setAvailableQty(response.data.qty);\n }\n }).catch((error) => {\n console.log('error response for Product: ', error);\n if (error.response) {\n // Server response outside 2xx\n } else if (error.request) {\n // No response\n }\n });\n };\n\n // If current Item ID is set or has changed, fetch that Product\n if (currentItem && currentItem.product_id) {\n fetchItem();\n }\n }\n\n }, [currentItem, qty]\n );\n\n // Effect: Reset items after an item has been updated\n useEffect(\n () => {\n if (currentItem && saveRequest && !saving) {\n handleEditQtyClose();\n setSaveMessage({error: false, message: (error) ? error : 'Item saved.'})\n }\n }, [currentItem, saveRequest, saving, error]\n );\n\n // All Views: Handle event from Info button\n const handleInfoClick = (item) => {\n setItemDetailState({dialog: !!(item), item: item});\n };\n\n const handleCloseItemDialog = () => {\n setItemDetailState({dialog: false, item: null});\n };\n\n // Create View: Handle event from Remove Item button\n const handleRemoveClick = (id) => {\n if (typeof onRemoveFunc === 'function') {\n let idx = itemList.findIndex(r => r.product_id === id);\n if (idx !== -1) {\n itemList[idx].qty_requested = 0;\n onRemoveFunc({item: itemList[idx], add: false, updateAvailable: true});\n }\n }\n };\n\n // Edit View: Handle event from Edit Qty button\n const handleEditQtyClick = (id) => {\n let idx = itemList.findIndex(r => r.product_id === id);\n if (idx !== -1) {\n const qty = itemList[idx].qty;\n // Display the New Qty input\n setQty(qty);\n setAvailableQty(qty);\n setNewQty(qty);\n setCurrentItem(itemList[idx]);\n setCurrentItemId(id);\n setSaveMessage({error: false, message: ''});\n }\n };\n\n // Edit View: Handle event from change in New Qty field\n const handleEditQtyChange = (e, id) => {\n const value = (e.target && e.target.value) ? e.target.value : null;\n if (value) {\n let qty = parseInt(value, 10);\n if (qty > availableQty) {\n qty = availableQty;\n }\n setNewQty(qty);\n }\n };\n\n // Edit View: Handle event from Qty Save button\n const handleSaveEditQty = (id) => {\n if (typeof onEditQtyFunc === 'function') {\n setSaveRequest(true);\n currentItem.qty_requested = newQty;\n onEditQtyFunc({item: currentItem, new_qty: newQty, add: true, updateAvailable: true});\n }\n };\n\n // Edit View: Handle event from Edit Qty Cancel button\n const handleEditQtyClose = () => {\n setQty(-1);\n setAvailableQty(0);\n setNewQty(-1);\n setCurrentItem(null);\n setCurrentItemId(null);\n setSaveRequest(false);\n };\n\n // Generate Order Item list rows\n const setRows = () => {\n const list = itemList;\n if (!list || list.length === 0) {\n return (\n <span key=\"file-empty\">No Items Added</span>\n )\n }\n\n return (\n itemList.map((item, index) => (\n <TableRow className={classes.tr} key={`order-item-${item.title}-${index}`}>\n\n <TableCell className={classes.td}>{item.sku}</TableCell>\n\n <TableCell className={classes.td}>{item.show_name}</TableCell>\n\n <TableCell className={classes.td}>{item.type_name}</TableCell>\n\n <TableCell className={classes.tdName}>\n {item.title}  \n <IconButton\n aria-label=\"Info\"\n className={classes.btnInfo}\n onClick={() => handleInfoClick(item)}\n >\n <InfoIcon/>\n </IconButton>\n </TableCell>\n\n <TableCell align=\"right\" className={classes.td}>{item.qty}</TableCell>\n\n {hasEditQty &&\n <TableCell className={classes.td}>\n {(!currentItemId || currentItemId !== item.product_id) &&\n <IconButton\n aria-label=\"Edit Qty\"\n className={classes.btn}\n onClick={() => handleEditQtyClick(item.product_id)}\n disabled={!!(currentItemId && currentItemId !== item.product_id)}\n >\n <EditIcon/>\n </IconButton>\n }\n {currentItemId && currentItemId === item.product_id &&\n <>\n {!saving &&\n <>\n <TextField\n type=\"number\"\n variant=\"outlined\"\n id={`edit-order-item-qty-${index}`}\n label=\"\"\n defaultValue={newQty}\n className=\"input-table-small number\"\n onChange={(e) => handleEditQtyChange(e, item.product_id)}\n InputProps={{\n inputProps: {\n max: availableQty,\n min: 0,\n step: 1\n }\n }}\n />\n <Button\n variant=\"contained\"\n color=\"primary\"\n className={classes.btnText}\n startIcon={<SaveIcon/>}\n onClick={() => handleSaveEditQty(item.product_id)}\n disabled={(qty === newQty)}\n >\n Update\n </Button>\n <Button\n variant=\"contained\"\n color=\"default\"\n className={classes.btnText}\n startIcon={<CloseIcon/>}\n onClick={() => handleEditQtyClose()}\n >\n Cancel\n </Button>\n </>\n }\n {saving &&\n <span className={classes.saving}>Saving...</span>\n }\n </>\n }\n </TableCell>\n }\n\n {hasRemove &&\n <TableCell className={classes.td}>\n <IconButton\n aria-label=\"Remove\"\n className={classes.btn}\n onClick={() => handleRemoveClick(item.product_id)}\n >\n <RemoveCircleOutlineIcon/>\n </IconButton>\n </TableCell>\n }\n </TableRow>\n ))\n )\n };\n\n const classes = useStyles();\n\n return (\n <>\n {itemList.length > 0 &&\n <div className=\"order-item-list-container\">\n <Table className={classes.table} size=\"small\" stickyHeader aria-label=\"Added Items\">\n <TableHead className={classes.tHead}>\n <TableRow>\n <TableCell className={classes.th}>SKU</TableCell>\n <TableCell className={classes.th}>Title</TableCell>\n <TableCell className={classes.th}>Category</TableCell>\n <TableCell className={classes.th}>Product</TableCell>\n <TableCell align=\"right\" className={classes.th}>Qty<br/>Requested</TableCell>\n {hasEditQty &&\n <TableCell className={classes.th}>Edit Qty</TableCell>\n }\n {hasRemove &&\n <TableCell className={classes.th}>Remove</TableCell>\n }\n </TableRow>\n </TableHead>\n <TableBody className={classes.tBody}>\n {[...setRows()]}\n\n {saveMessage.message !== '' &&\n <TableRow key=\"order-item-message\">\n <TableCell colSpan={5} align=\"right\">\n <span className={(saveMessage.error) ? classes.messageError : classes.message}>\n {saveMessage.message}\n </span>\n </TableCell>\n </TableRow>\n }\n </TableBody>\n </Table>\n <ProductDetailDialog\n openDialog={itemDetailState.dialog}\n productId={(itemDetailState.item) ? itemDetailState.item.product_id : null}\n onCloseFunc={handleCloseItemDialog}\n />\n </div>\n }\n </>\n )\n}\n\nexport default OrderItemsList;\n","import axios from 'axios';\nimport {getPostHeaders} from './headers';\nimport {RESOURCES as resources} from '../orderResources';\n\n/**\n * Post a request to Start, Create or Update an Order\n *\n * @param type\n * @param data\n * @return {Promise<unknown>}\n */\nexport const postOrder = (type, data) => {\n return new Promise(function (resolve, reject) {\n if (data) {\n\n const onFailure = function (result) {\n return reject('Order failed: ', result);\n }\n\n const onSuccess = function (result) {\n return resolve(result);\n }\n\n const params = {\n data: data\n };\n let cfg;\n switch (type) {\n case 'startOrder':\n cfg = resources.OrderStart.CREATE(params);\n break;\n case 'createOrder':\n cfg = resources.OrderCreate.CREATE(params);\n break;\n case 'updateOrder':\n cfg = resources.Order.UPDATE(params);\n break;\n default:\n break;\n }\n\n // Set headers\n const headers = getPostHeaders(true);\n\n try {\n axios({\n method: cfg.method,\n url: cfg.uri,\n data: cfg.data,\n headers: headers\n })\n .then((result) => {\n if (result && result.data) {\n return onSuccess(result.data);\n }\n })\n .catch((error) => {\n if (error.response) {\n // Server response outside 2xx\n console.log('Order Error response: ', error);\n onFailure(error.response);\n } else if (error.request) {\n // No response\n console.log('Order Error request: ', error);\n onFailure(error.request);\n } else {\n console.log('Order Error: ', error);\n onFailure(error);\n }\n });\n } catch (err) {\n console.log('Order try/catch error: ', err);\n onFailure(err);\n }\n } else {\n return resolve();\n }\n });\n};\n\n/**\n * Post a request to Add or Update a Product in an Order\n *\n * @param type\n * @param data\n * @return {Promise<unknown>}\n */\nexport const postItem = (type, data) => {\n return new Promise(function (resolve, reject) {\n if (data) {\n\n const onFailure = function (result) {\n return reject('Order failed: ', result);\n }\n\n const onSuccess = function (result) {\n return resolve(result);\n }\n\n let productToPost = {\n order_id: data.order_id,\n product_id: data.product_id,\n qty: data.qty\n };\n if (type === 'updateItem') {\n productToPost.id = data.id;\n productToPost.new_qty = data.new_qty;\n }\n const params = {\n data: productToPost\n };\n let cfg;\n switch (type) {\n case 'addItem':\n cfg = resources.OrderItem.CREATE(params);\n break;\n case 'updateItem':\n cfg = resources.OrderItem.UPDATE(params);\n break;\n default:\n break;\n }\n\n // Set headers\n const headers = getPostHeaders(true);\n\n try {\n axios({\n method: cfg.method,\n url: cfg.uri,\n data: cfg.data,\n headers: headers\n })\n .then((result) => {\n if (result && result.data) {\n return onSuccess(result.data);\n }\n })\n .catch((error) => {\n if (error.response) {\n // Server response outside 2xx\n console.log('Order Error response: ', error);\n onFailure(error.response);\n } else if (error.request) {\n // No response\n console.log('Order Error request: ', error);\n onFailure(error.request);\n } else {\n console.log('Order Error: ', error);\n onFailure(error);\n }\n });\n } catch (err) {\n console.log('Order try/catch error: ', err);\n onFailure(err);\n }\n } else {\n return resolve();\n }\n });\n};\n","import React, {useState} from 'react';\nimport {createPortal} from 'react-dom';\nimport {Link, withRouter} from 'react-router-dom';\nimport {connect} from 'react-redux';\nimport Emitter from '../utils/eventEmitter';\nimport {Field, Form} from 'react-final-form';\nimport classnames from 'classnames';\nimport {ListButton, TextInput, TopToolbar} from 'react-admin';\nimport ContactCreateDialog from '../components/ContactCreateDialog';\nimport ContactDetailsFromID from '../components/ContactDetailsFromID';\nimport FieldDescription from '../components/FieldDescription';\nimport FieldDivider from '../components/FieldDivider';\nimport FieldMessage from '../components/FieldMessage';\nimport GetListSelectInput from '../components/GetListSelectInput';\nimport OrderItemsAvailableListContainer from '../components/OrderItemsAvailableListContainer';\nimport OrderItemsList from '../components/OrderItemsList';\nimport SelectFromListInput from '../components/SelectFromListInput';\nimport {postItem, postOrder} from '../utils/apiOrderFunctions';\nimport {checkAuthentication} from '../utils/authFunctions';\nimport {assembleDefaultQueryString} from '../utils/dataFunctions';\nimport {viewStyles} from '../global/styles';\nimport {makeStyles} from '@material-ui/core/styles';\nimport AppBar from '@material-ui/core/AppBar';\nimport Avatar from '@material-ui/core/Avatar';\nimport Button from '@material-ui/core/Button';\nimport Tabs from '@material-ui/core/Tabs';\nimport Tab from '@material-ui/core/Tab';\nimport OrdersIcon from '@material-ui/icons/Receipt';\nimport '../css/admin.css';\n\nconst useStyles = makeStyles((theme) => ({\n root: {\n flexGrow: 1,\n backgroundColor: '#ffffff',\n borderRadius: 4,\n boxShadow: '0 2px 1px -1px rgba(0,0,0,0.2), 0 1px 1px 0 rgba(0,0,0,0.14), 0 1px 3px 0 rgba(0,0,0,0.12)'\n },\n appBar: {\n backgroundColor: '#9e9e9e',\n boxShadow: 'none',\n borderTopLeftRadius: 4,\n borderTopRightRadius: 4\n },\n addNewButton: {\n display: 'inline-block',\n margin: '0 0 1em 0'\n },\n itemSelect: {\n display: 'inline-flex',\n width: 'calc(100% - 200px)'\n },\n tabIndicator: {\n backgroundColor: '#508242',\n height: 3\n },\n toolbar: {\n display: 'flex',\n justifyContent: 'flex-end',\n alignItems: 'flex-start',\n backgroundColor: 'transparent',\n paddingTop: theme.spacing(3),\n paddingBottom: theme.spacing(1),\n minHeight: theme.spacing(5),\n [theme.breakpoints.up('xs')]: {\n paddingLeft: 0,\n paddingRight: 0\n },\n [theme.breakpoints.down('sm')]: {\n paddingRight: theme.spacing(2)\n },\n [theme.breakpoints.down('xs')]: {\n padding: theme.spacing(1)\n }\n }\n}));\n\n// Add a top toolbar with a List button\nconst CreateToolbar = props => {\n const classes = useStyles(props);\n const defaultOrderQueryString = assembleDefaultQueryString('Order');\n return (\n <TopToolbar {...props} className={classnames(classes.toolbar)}>\n <ListButton basePath={`/Order${defaultOrderQueryString}`}/>\n </TopToolbar>\n )\n};\n\n// Add an AppBar title\nconst CreateTitle = () => {\n const container = (typeof document !== 'undefined') ? document.getElementById('react-admin-title') : null;\n if (!container) return null;\n const titleElement = (\n <span><Avatar style={viewStyles.avatar} className=\"avatar-title\"\n alt=\"Create an Order\"><OrdersIcon style={viewStyles.avatarSvg}/></Avatar>Create an Order</span>\n );\n return createPortal(titleElement, container);\n};\n\nconst today = new Date();\nconst todayValue = today.toISOString();\n\n/**\n * Form: Create Order with Product Manipulation\n *\n * @param props\n * @param keycloakReady\n * @param keycloakAuthenticated\n * @param tokens\n * @return {JSX.Element}\n * @constructor\n */\nfunction OrderCreateForm({props, keycloakReady, keycloakAuthenticated, tokens}) {\n\n // This page requires authentication\n let isAuthenticated = checkAuthentication(tokens.token, keycloakAuthenticated);\n if (keycloakReady && !isAuthenticated) {\n Emitter.emit('updateKeycloak');\n }\n\n // State: Order Started, Products Added, Organization\n const [orderStartedState, setOrderStartedState] = useState(false);\n const [productsAddedState, setProductsAddedState] = useState(false);\n const [, setOrgState] = useState({\n id: null,\n name: null\n });\n // State: Started Messaging, Product Messaging\n const [startedMessageState, setStartedMessageState] = useState({\n error: false,\n message: '',\n });\n const [productMessageState, setProductMessageState] = useState({\n error: false,\n message: '',\n });\n // State: Order Complete, Error, Messaging\n const [orderState, setOrderState] = useState({\n complete: false,\n error: false,\n message: '',\n submitting: false\n });\n const [defaultOrderQueryString] = useState(assembleDefaultQueryString('Order'));\n // State: Tab display\n const [tabState, setTab] = useState(0);\n const handleTabChange = (e, newValue) => setTab(newValue);\n // State: Create Contact Dialog\n const [createContactDialogOpen, setCreateContactDialogOpen] = useState(false);\n const [refreshContacts, setRefreshContacts] = useState(false);\n // State: Product Qty update\n const [productToUpdate, setProductToUpdate] = useState(null);\n const [updateProducts, setUpdateProducts] = useState(false);\n const [productsSubmitted, setProductsSubmitted] = useState(false);\n\n /**\n * Process updates from Form Tab buttons\n *\n * @param form\n * @param step\n * @param values\n */\n const handleFormStep = (form, step, values) => {\n let data;\n let orderStarted = orderStartedState;\n\n // Step: Initialize an Order to retrieve an ID\n if (step === 'startOrder') {\n\n data = assembleFormData(step, values);\n\n postOrder('startOrder', data).then(result => {\n // Store the resulting ID; set Form stage; advance to Add Products Tab\n form.mutators.setValue('id', result.id);\n setOrderStartedState(true);\n setStartedMessageState({error: false, message: ''});\n setTab(1);\n }).catch(error => {\n form.mutators.setValue('id', null);\n setOrderStartedState(false);\n setProductsAddedState(false);\n setStartedMessageState({\n error: true,\n message: 'Sorry, there was an error creating this Order. Please check and resubmit.'\n });\n setTab(0);\n });\n }\n\n // Step: Go to the Add/Update Products tab\n if (step === 'goToAddProducts') {\n setOrderStartedState(true);\n setTab(1);\n }\n\n // Step: Go to the Create Order tab\n if (step === 'goToCreateOrder') {\n // Products have been added; set Form stage; advance to Create (Complete) Order Tab\n setOrderStartedState(orderStarted);\n setTab(2);\n }\n\n // Step: Submit all Products and create/finalize the Order\n if (step === 'createOrder') {\n\n // Assemble form data for Order call\n data = assembleFormData(step, values);\n let items = JSON.parse(JSON.stringify(values.items));\n\n setOrderState({\n complete: false,\n error: false,\n message: 'Submitting Order...',\n submitting: true\n });\n\n // Post Receipt function\n const postOrderData = (data) => {\n postOrder('createOrder', data).then(result => {\n // Order has been completed\n setOrderState({\n complete: true,\n error: false,\n message: 'Your Order has been saved.',\n submitting: false\n })\n handleFormStep(form, 'goToOrderCompleted', values);\n\n }).catch(error => {\n setOrderState({\n complete: false,\n error: true,\n message: 'Sorry, there was an error saving this Order.',\n submitting: false\n });\n });\n };\n\n // Sequentially post all Products in list\n let tasks = [];\n let taskLength = 0;\n for (let i = 0; i < items.length; i++) {\n const task = assembleProductSubmitData(items[i], values);\n const taskIdx = tasks.findIndex(r => r.product_id === task.product_id);\n if (!task.submitted && taskIdx === -1) {\n tasks.push({\n index: taskLength,\n data: task\n });\n taskLength++;\n }\n }\n\n if (productsSubmitted) {\n // If Order is being submitted again due to an error, do not resubmit Products\n postOrderData(data);\n } else {\n // Start a Promise sequence with all tasks\n const starterPromise = Promise.resolve(null);\n tasks.reduce(\n (p, spec) => p.then(() => postItem('addItem', spec.data)\n .then((result) => {\n // Update this Product as submitted\n const itemsIdx = items.findIndex(r => r.product_id === result.product_id);\n if (itemsIdx !== -1) {\n items[itemsIdx].submitted = true;\n }\n\n // If all tasks in the list have completed:\n if (spec.index >= (taskLength - 1)) {\n // Update Product list with submitted states\n form.mutators.setValue('items', items);\n setProductsSubmitted(true);\n\n // Products have been submitted; post Order\n postOrderData(data);\n }\n })\n ), starterPromise)\n .catch((error) => {\n console.log('Product Save error: ', error);\n setOrderState({\n complete: false,\n error: true,\n message: 'Sorry, there was an error saving Products for this Order.',\n submitting: false\n });\n // Update Product items with submitted states\n form.mutators.setValue('items', items);\n setProductsSubmitted(false);\n setTab(1);\n }\n );\n }\n }\n\n // Step: Go to the Completed Order tab\n if (step === 'goToOrderCompleted') {\n setTab(3);\n }\n };\n\n // Event: Update form values from active select fields\n const handleSetValueFromSelect = (e, field, form) => {\n const value = (e) ? e : '';\n if (field === 'org_id_select') {\n setOrgState({id: e.id, name: e.name});\n form.mutators.setValue('org_id', e?.id ?? '');\n }\n if (field === 'ship_to_id_select') {\n form.mutators.setValue('ship_to_id', e?.id ?? '');\n }\n if (field === 'shipped_with_select') {\n form.mutators.setValue('shipped_with', value);\n // Clear the Shipping Method upon new selection of Company\n form.mutators.setValue('shipping_type', '');\n }\n if (field === 'shipping_type_select') {\n form.mutators.setValue('shipping_type', value);\n }\n };\n\n // Event: add or remove Product or adjust its requested Quantity\n const handleAddOrRemoveItem = (e, form, values) => {\n const item = JSON.parse(JSON.stringify(e.item));\n const items = (values.items) ? JSON.parse(JSON.stringify(values.items)) : [];\n const idx = items.findIndex(r => r.product_id === item.product_id);\n let removeItem = false;\n let error = false;\n let message = '';\n let listUpdated = false;\n\n // If requested to add:\n if (e.add) {\n if (idx === -1) {\n // If not in the list, add the Order's ID, add the Product, and update the form\n item.order_id = values.id;\n item.qty = item.qty_requested;\n items.push(item);\n listUpdated = true;\n } else {\n if (item.qty_requested !== items[idx].qty) {\n // Item is in list; update requested Qty\n items[idx].qty = item.qty_requested;\n listUpdated = true;\n\n // If Qty has become 0, consider the item removed\n if (items[idx].qty === 0) {\n removeItem = true;\n }\n } else {\n // This item has already been added.\n error = true;\n message = item.title + ' already exists in the list.';\n }\n }\n }\n\n // Update Available table if tally table was edited:\n if (e.updateAvailable && items[idx]) {\n items[idx].qty_requested = item.qty_requested;\n items[idx].added = item.added;\n setUpdateProducts(true);\n setProductToUpdate(items[idx]);\n setTimeout(function () {\n setUpdateProducts(false);\n setProductToUpdate(null);\n }, 100);\n }\n\n // If requested to remove:\n if (!e.add && idx !== -1) {\n removeItem = true;\n }\n\n // If item is requested to be removed or its Qty is 0, remove it from the list\n if (removeItem) {\n items[idx].added = false;\n items.splice(idx, 1);\n listUpdated = true;\n }\n\n // Update form values\n if (listUpdated) {\n form.mutators.setValue('items', items);\n setProductsAddedState(true);\n }\n\n // Update message state\n setProductMessageState({error: error, message: message});\n\n if (items.length === 0) {\n setProductsAddedState(false);\n }\n };\n\n /**\n * Assemble data for Order POST calls based on form values\n *\n * @param step\n * @param values\n */\n const assembleFormData = (step, values) => {\n let data = {};\n if (step === 'startOrder') {\n data.org_id = values.org_id;\n }\n if (step === 'createOrder' || step === 'updateOrder') {\n data.id = values.id;\n data.org_id = values.org_id;\n data.ship_to_id = values.ship_to_id;\n }\n if (step === 'createOrder') {\n data.client_notes = (values.client_notes) ? values.client_notes : '';\n data.shipped_with = (values.shipped_with) ? values.shipped_with : '';\n data.shipping_type = (values.shipping_type) ? values.shipping_type : '';\n data.required_by = todayValue;\n data.ship_to_id = values.ship_to_id;\n\n if (data.shipped_with === '') {\n delete data.shipped_with;\n }\n if (data.shipping_type === '') {\n delete data.shipping_type;\n }\n }\n return data;\n };\n\n const assembleProductSubmitData = (item, values) => {\n let data = {};\n data.order_id = values.id;\n data.product_id = item.product_id;\n data.qty = item.qty;\n return data;\n };\n\n const handleSubmit = (e) => {\n // Form is not submitted conventionally\n e.preventDefault();\n };\n\n const handleContactCreated = (item, form, values) => {\n if (item.id) {\n form.mutators.setValue('ship_to_id', item.id);\n form.mutators.setValue('ship_to_name', item.name);\n form.mutators.setValue('ship_to_id_select', item.id);\n setRefreshContacts(true);\n }\n };\n\n const handleCloseCreateContactDialog = () => {\n setCreateContactDialogOpen(false);\n };\n\n const classes = useStyles();\n\n return (\n <>\n <CreateTitle/>\n <CreateToolbar {...props}/>\n <Form\n onSubmit={handleSubmit}\n mutators={{\n setValue: ([field, value], state, {changeValue}) => {\n changeValue(state, field, () => value)\n }\n }}\n render={({form, handleSubmit, values}) => {\n\n // Determine disabled status for buttons and tabs\n const isDisabled = (item) => {\n const v = values;\n switch (item) {\n case 'submit0':\n return (!v.org_id);\n case 'submit1':\n return (!productsAddedState);\n case 'submit2':\n return (!v.ship_to_id || !v.shipped_with || !v.shipping_type || orderState.complete || orderState.submitting);\n case 'tab0':\n return (orderStartedState);\n case 'tab1':\n return (!orderStartedState);\n case 'tab2':\n return (!productsAddedState || !orderStartedState);\n case 'tab3':\n return (!orderState.complete);\n default:\n return false;\n }\n };\n\n return (\n <form onSubmit={handleSubmit}>\n <div className={classes.root}>\n\n {/* Tab Bar */}\n\n <AppBar position=\"relative\" className={classes.appBar}>\n <Tabs\n value={tabState}\n onChange={handleTabChange}\n aria-label=\"Order Form Tabs\"\n classes={{indicator: classes.tabIndicator}}\n >\n <Tab id=\"order-tab-start\" label=\"Start Order\"\n aria-controls=\"order-tabpanel-start\" disabled={isDisabled('tab0')}/>\n <Tab id=\"order-tab-add\" label=\"Add Products\"\n aria-controls=\"order-tabpanel-add\" disabled={isDisabled('tab1')}/>\n <Tab id=\"order-tab-complete\" label=\"Complete Order\"\n aria-controls=\"order-tabpanel-complete\" disabled={isDisabled('tab2')}/>\n <Tab id=\"order-tab-completed\" label=\"Order Completed\"\n aria-controls=\"order-tabpanel-completed\" disabled={isDisabled('tab3')}/>\n </Tabs>\n </AppBar>\n\n {/* Tab Content 0: Start Order */}\n\n <div\n role=\"tabpanel\"\n hidden={tabState !== 0}\n id=\"order-tabpanel-start\"\n aria-labelledby=\"order-tab-start\"\n className=\"tab-panel form-order\"\n >\n <FieldDescription\n instructions={true} marginBottom={true}\n text={(!orderStartedState)\n ? `Start an Order by selecting a Client.`\n : `To select a different Client, please create a different Order.`\n }\n />\n\n <Field name=\"OrgField\">\n {props => (\n <SelectFromListInput\n source=\"org_id_select\"\n displayField={(tabState === 0)}\n resourceName=\"Organization\"\n listLabel=\"Select a Client\"\n itemPlural=\"Clients\"\n listFilters={{\n active: true\n }}\n className=\"input-block input-400\"\n isRequired={true}\n hasClear={false}\n onChangeFunc={(e) => handleSetValueFromSelect(e, 'org_id_select', form)}\n />\n )}\n </Field>\n <TextInput label=\"\" source=\"org_id\" className=\"hidden\" disabled/>\n\n {startedMessageState.message &&\n <FieldMessage\n error={(startedMessageState.error)}\n text={startedMessageState.message}\n />\n }\n\n <FieldDescription\n instructions={true} marginBottom={true}\n text={`Once Client is set, click Start Order. You will then be \n able to add Products to the Order.`}\n />\n <div className=\"btns-container right\">\n {!orderStartedState &&\n <Button\n color=\"primary\"\n variant=\"contained\"\n onClick={() => handleFormStep(form, 'startOrder', values)}\n disabled={!!(isDisabled('submit0'))}\n >\n Start Order\n </Button>\n }\n {orderStartedState &&\n <Button\n color=\"primary\"\n variant=\"contained\"\n onClick={() => handleFormStep(form, 'updateOrder', values)}\n disabled={!!(isDisabled('submit0'))}\n >\n Update Order\n </Button>\n }\n </div>\n </div>\n\n {/* Tab Content 1: Add Product Items */}\n\n <div\n role=\"tabpanel\"\n hidden={tabState !== 1}\n id=\"order-tabpanel-add\"\n aria-labelledby=\"order-tab-add\"\n className=\"tab-panel form-order\"\n >\n <FieldDescription\n instructions={true} marginBottom={true}\n text={`Choose Products to add to this Order.`}\n />\n <FieldDescription\n marginBottom={false}\n text={`For each Product to add, click the Add icon. Enter a requested \n quantity (up to available inventory) and check the Add checkbox.`}\n />\n <FieldDescription\n marginBottom={false}\n text={`To remove a Product from the list, click the Add icon and reduce \n its requested quantity to 0.`}\n />\n <FieldDescription\n marginBottom={true}\n text={`Select a Title or Categorys to view available Products.`}\n />\n\n <OrderItemsAvailableListContainer\n {...props}\n displayFields={(tabState === 1)}\n orgId={values.org_id}\n productToUpdate={productToUpdate}\n updateList={updateProducts}\n onProductAdjust={(e) => handleAddOrRemoveItem(e, form, values)}\n />\n {productMessageState.message &&\n <FieldMessage\n error={(productMessageState.error)}\n text={productMessageState.message}\n />\n }\n <TextInput label=\"\" source=\"order_items_filter_show_id\"\n className=\"hidden\" disabled\n />\n <TextInput label=\"\" source=\"filter_product_type_id\"\n className=\"hidden\" disabled\n />\n <FieldDivider type=\"divider\" margin=\"bottom\"/>\n <FieldDescription text={`Items Added`} instructions={true}/>\n {(!values.items || values?.items?.length === 0) &&\n <FieldDescription\n marginBottom={true}\n text={`No Products have yet been added to this Order.`}\n />\n }\n {values?.items?.length > 0 &&\n <FieldDescription\n marginBottom={true}\n text={`The following Products will be added to this Order. You may adjust or remove Products after adding:`}\n />\n }\n <OrderItemsList\n itemList={values.items}\n hasEditQty={true}\n hasRemove={true}\n onEditQtyFunc={(e) => handleAddOrRemoveItem(e, form, values)}\n onRemoveFunc={(e) => handleAddOrRemoveItem(e, form, values)}\n />\n <FieldDivider type=\"divider\" margin=\"bottom\"/>\n\n <FieldDescription\n instructions={true}\n text={`When finished adding Products, click Continue to add a Due Date and \n complete the Order.`}\n />\n <div className=\"order-warning\">\n Note: Do not navigate away from this page or click the Back button in your\n browser, or your Order details may be lost.\n </div>\n <div className=\"btns-container right\">\n <Button\n color=\"primary\"\n variant=\"contained\"\n onClick={() => handleFormStep(form, 'goToCreateOrder', values)}\n disabled={!!(isDisabled('submit1'))}\n >\n Continue\n </Button>\n </div>\n </div>\n\n {/* Tab Content 2: Complete Order */}\n\n <div\n role=\"tabpanel\"\n hidden={tabState !== 2}\n id=\"order-tabpanel-complete\"\n aria-labelledby=\"order-tab-complete\"\n className=\"tab-panel form-order\"\n >\n <div className=\"btns-container margin-bottom\">\n <Button\n color=\"primary\" variant=\"outlined\"\n onClick={() => handleFormStep(form, 'goToAddProducts', values)}\n >\n Back\n </Button>\n </div>\n <FieldDescription\n instructions={true} marginBottom={true}\n text={`Select a Destination for this Order and enter the date this Order \n should be received.`}\n />\n\n <Field name=\"shipToField\">\n {props => (\n <SelectFromListInput\n source=\"ship_to_id_select\"\n displayField={(tabState === 0)}\n resourceName=\"Contact\"\n listLabel=\"Select a Destination\"\n itemPlural=\"Contacts\"\n listFilters={{\n active: true,\n params: {\n filter: {\n filter_org_id: values.org_id\n },\n }\n }}\n className=\"input-inline input-400\"\n isRequired={true}\n refresh={refreshContacts}\n selectedObject={(values.ship_to_id && values.ship_to_name) ? {\n id: values.ship_to_id,\n name: values.ship_to_name\n } : {id: '', name: ''}}\n onChangeFunc={(e) => handleSetValueFromSelect(e, 'ship_to_id_select', form)}\n disabled={(!values.org_id)}\n />\n )}\n </Field>\n <Button\n variant=\"contained\"\n color=\"default\"\n onClick={() => setCreateContactDialogOpen(true)}\n className={classes.addNewButton}\n >\n Create New Contact\n </Button>\n <TextInput label=\"\" source=\"ship_to_id\" className=\"hidden\" disabled/>\n <TextInput label=\"\" source=\"ship_to_name\" className=\"hidden\" disabled/>\n <br/>\n <FieldDivider type=\"break\" margin=\"bottom\"/>\n {values.org_id && values.ship_to_id &&\n <ContactDetailsFromID org_id={values.org_id} id={values.ship_to_id}/>\n }\n <FieldDivider type=\"break\" margin=\"bottom\"/>\n\n <FieldDescription\n instructions={true} marginBottom={true}\n text={`Add a Shipping Carrier and method.`}\n />\n <div className=\"order-warning\">\n Note: Please choose only UPS, FedEx, or Parrot Communications. Other methods\n are for internal use only.\n </div>\n <GetListSelectInput\n {...props}\n displayField={(tabState === 2)}\n source=\"shipped_with_select\"\n label=\"Carrier *\"\n displayType=\"name\"\n resourceFile=\"default\"\n resourceName=\"ShippingCompany\"\n resourceActive={true}\n addLabel={false}\n onChangeFunc={(e) => handleSetValueFromSelect(e, 'shipped_with_select', form)}\n isRequired={true}\n disabled={(!values.org_id)}\n className=\"input-inline input-320\"\n allowEmpty\n />\n <GetListSelectInput\n {...props}\n displayField={(tabState === 2)}\n source=\"shipping_type_select\"\n label=\"Shipping Method *\"\n displayType=\"name\"\n resourceFile=\"default\"\n resourceName=\"ShippingMethod\"\n resourceActive={true}\n requiresFilter={true}\n filter={(values.shipped_with) ? {filter_company_id: values.shipped_with} : null}\n onChangeFunc={(e) => handleSetValueFromSelect(e, 'shipping_type_select', form)}\n className=\"input-inline input-280\"\n disabled={(!values.shipped_with)}\n addLabel={false}\n isRequired={true}\n allowEmpty\n />\n <TextInput label=\"\" source=\"shipped_with\"\n className=\"hidden\" disabled\n />\n <TextInput label=\"\" source=\"shipping_type\"\n className=\"hidden\" disabled\n />\n <FieldDivider type=\"break\"/>\n\n <FieldDescription\n instructions={true} marginBottom={true}\n text={`If there are additional instructions, add optional Notes.`}\n />\n <TextInput label=\"Notes\" source=\"client_notes\" multiline fullWidth={true}/>\n\n {values && values.items && values.items.length > 0 &&\n <>\n <FieldDivider type=\"divider\" margin=\"bottom\"/>\n <FieldDescription text={`Items Added`} instructions={true}/>\n <FieldDescription\n marginBottom={true}\n text={`The following Products were added to this Order. To edit or remove Products, click Back to the Add Products tab.`}\n />\n <OrderItemsList\n itemList={values.items}\n hasEditQty={false}\n hasRemove={false}\n />\n <FieldDivider type=\"divider\" margin=\"bottom\"/>\n </>\n }\n\n {orderState.message &&\n <FieldMessage error={(orderState.error)} text={orderState.message}/>\n }\n\n <FieldDescription\n instructions={true}\n text={`Click Complete Order to submit the Order and its added Items.`}\n />\n <div className=\"order-warning\">\n Note: Do not navigate away from this page or click the Back button in your\n browser, or your Order details may be lost.\n </div>\n <div className=\"btns-container right\">\n <Button\n color=\"primary\" variant=\"outlined\"\n onClick={() => handleFormStep(form, 'goToAddProducts', values)}\n >\n Back\n </Button>\n <Button\n color=\"primary\"\n variant=\"contained\"\n onClick={() => handleFormStep(form, 'createOrder', values)}\n disabled={!!(isDisabled('submit2'))}\n >\n Complete Order\n </Button>\n </div>\n </div>\n\n {/* Tab Content 4: Order Completed */}\n\n <div\n role=\"tabpanel\"\n hidden={tabState !== 3}\n id=\"order-tabpanel-completed\"\n aria-labelledby=\"order-tab-completed\"\n className=\"tab-panel form-order\"\n >\n <FieldDescription\n instructions={true} marginBottom={true}\n text={`This Order has been submitted. You may view this Order's status from \n the Orders list.`}\n />\n {orderState.message &&\n <FieldMessage text={orderState.message}/>\n }\n <Button\n variant=\"outlined\"\n component={Link}\n to={`/Order${defaultOrderQueryString}`}\n >\n View Orders List\n </Button>\n </div>\n\n <div className=\"order-disclaimer\">\n Orders created after 12pm PST may not be fulfilled until the next business day.\n </div>\n\n </div>\n\n <ContactCreateDialog\n selectedOrgId={values.org_id}\n openDialog={createContactDialogOpen}\n onCompleteFunc={(e) => handleContactCreated(e, form, values)}\n onCloseFunc={handleCloseCreateContactDialog}\n />\n </form>\n )\n }}\n >\n </Form>\n </>\n )\n}\n\nconst mapStateToProps = (state) => {\n return {\n keycloakAuthenticated: state.keycloakState.keycloakAuthenticated,\n keycloakReady: state.keycloakState.keycloakReady,\n tokens: {\n token: state.tokens.token\n }\n };\n};\n\nexport default withRouter(connect(\n mapStateToProps,\n {}\n )(OrderCreateForm)\n);\n","import * as React from \"react\";\nimport {Route} from 'react-router-dom';\n\nimport Dashboard from './routes/Dashboard';\nimport LoginPage from './routes/Login';\nimport OrderCreate from './routes/OrderCreate';\n\nconst customRoutes = [\n <Route exact path=\"/Order/create\" component={OrderCreate}/>,\n <Route path=\"/login&state=:query\" component={LoginPage}/>,\n <Route path=\"/&error=login_required&state=:query\" component={LoginPage}/>,\n <Route path=\"/&state=:query\" component={Dashboard}/>,\n <Route path=\"/state=:query\" component={Dashboard}/>,\n];\n\nexport default customRoutes;","const englishMessages = {\n ra: {\n action: {\n add_filter: 'Add filter',\n add: 'Add',\n back: 'Go Back',\n bulk_actions: '1 item selected |||| %{smart_count} items selected',\n cancel: 'Cancel',\n clear_input_value: 'Clear value',\n clone: 'Clone',\n confirm: 'Confirm',\n create: 'Create',\n delete: 'Delete',\n edit: 'Edit',\n export: 'Export',\n list: 'List',\n refresh: 'Refresh',\n remove_filter: 'Remove this filter',\n remove: 'Remove',\n save: 'Save',\n search: 'Search',\n show: 'View',\n sort: 'Sort',\n undo: 'Undo',\n unselect: 'Unselect',\n expand: 'Expand',\n close: 'Close',\n open_menu: 'Open menu',\n close_menu: 'Close menu',\n },\n boolean: {\n true: 'Yes',\n false: 'No',\n null: '',\n },\n page: {\n create: 'Create %{name}',\n dashboard: 'Dashboard',\n edit: '%{name} #%{id}',\n error: 'Something went wrong',\n list: '%{name}',\n loading: 'Loading',\n not_found: 'Not Found',\n show: '%{name} #%{id}',\n empty: 'No %{name} yet.',\n invite: 'Do you want to add one?',\n },\n input: {\n file: {\n upload_several:\n 'Drop some files to upload, or click to select one.',\n upload_single: 'Drop a file to upload, or click to select it.',\n },\n image: {\n upload_several:\n 'Drop some pictures to upload, or click to select one.',\n upload_single:\n 'Drop a picture to upload, or click to select it.',\n },\n references: {\n all_missing: 'Unable to find references data.',\n many_missing:\n 'At least one of the associated references no longer appears to be available.',\n single_missing:\n 'Associated reference no longer appears to be available.',\n },\n password: {\n toggle_visible: 'Hide password',\n toggle_hidden: 'Show password',\n },\n },\n message: {\n about: 'About',\n are_you_sure: 'Are you sure?',\n bulk_delete_content:\n 'Are you sure you want to delete this %{name}? |||| Are you sure you want to delete these %{smart_count} items?',\n bulk_delete_title:\n 'Delete %{name} |||| Delete %{smart_count} %{name}',\n delete_content: 'Are you sure you want to delete this item?',\n delete_title: 'Delete %{name} #%{id}',\n details: 'Details',\n error:\n \"A client error occurred and your request couldn't be completed.\",\n invalid_form: 'The form is not valid. Please check for errors',\n loading: 'The page is loading, just a moment please',\n no: 'No',\n not_found:\n 'Either you typed a wrong URL, or you followed a bad link.',\n yes: 'Yes',\n unsaved_changes:\n \"Some of your changes weren't saved. Are you sure you want to ignore them?\",\n },\n navigation: {\n no_results: 'No results found',\n no_more_results:\n 'The page number %{page} is out of boundaries. Try the previous page.',\n page_out_of_boundaries: 'Page number %{page} out of boundaries',\n page_out_from_end: 'Cannot go after last page',\n page_out_from_begin: 'Cannot go before page 1',\n page_range_info: '%{offsetBegin}-%{offsetEnd} of %{total}',\n page_rows_per_page: 'Rows per page:',\n next: 'Next',\n prev: 'Prev',\n },\n auth: {\n auth_check_error: 'Please login to continue',\n user_menu: 'Profile',\n username: 'Username',\n password: 'Password',\n sign_in: 'Sign in',\n sign_in_error: 'Authentication failed, please retry',\n logout: 'Logout',\n },\n notification: {\n updated: 'Element updated |||| %{smart_count} elements updated',\n created: 'Element created',\n deleted: 'Element deleted |||| %{smart_count} elements deleted',\n bad_item: 'Incorrect element',\n item_doesnt_exist: 'Element does not exist',\n http_error: 'Server communication error',\n data_provider_error:\n 'dataProvider error. Check the console for details.',\n i18n_error:\n 'Cannot load the translations for the specified language',\n canceled: 'Action cancelled',\n logged_out: 'Your session has ended, please reconnect.',\n },\n validation: {\n required: 'Field is Required',\n minLength: 'Must be %{min} characters at least',\n maxLength: 'Must be %{max} characters or less',\n minValue: 'Must be at least %{min}',\n maxValue: 'Must be %{max} or less',\n number: 'Must be a number',\n email: 'Must be a valid email',\n oneOf: 'Must be one of: %{options}',\n regex: 'Must match a specific format (regexp): %{pattern}',\n },\n },\n};\n\nconst customEnglishMessages = {\n ...englishMessages,\n pos: {\n search: 'Search',\n configuration: 'Configuration',\n language: 'Language',\n theme: {\n name: 'Theme',\n light: 'Light',\n dark: 'Dark',\n },\n dashboard: {\n monthly_revenue: 'Monthly Revenue',\n month_history: '30 Day Revenue History',\n new_orders: 'New Orders',\n pending_reviews: 'Pending Reviews',\n new_customers: 'New Customers',\n pending_orders: 'Pending Orders',\n order: {\n items:\n 'by %{customer_name}, one item |||| by %{customer_name}, %{nb_items} items',\n },\n welcome: {\n title: 'Welcome to the react-admin e-commerce demo',\n subtitle:\n \"This is the admin of an imaginary poster shop. Feel free to explore and modify the data - it's local to your computer, and will reset each time you reload.\",\n aor_button: 'react-admin site',\n demo_button: 'Source for this demo',\n },\n },\n menu: {\n sales: 'Sales',\n catalog: 'Catalog',\n customers: 'Customers',\n },\n },\n resources: {\n customers: {\n name: 'Customer |||| Customers',\n fields: {\n commands: 'Orders',\n first_seen: 'First seen',\n groups: 'Segments',\n last_seen: 'Last seen',\n last_seen_gte: 'Visited Since',\n name: 'Name',\n total_spent: 'Total spent',\n password: 'Password',\n confirm_password: 'Confirm password',\n },\n filters: {\n last_visited: 'Last visited',\n today: 'Today',\n this_week: 'This week',\n last_week: 'Last week',\n this_month: 'This month',\n last_month: 'Last month',\n earlier: 'Earlier',\n has_ordered: 'Has ordered',\n has_newsletter: 'Has newsletter',\n group: 'Segment',\n },\n fieldGroups: {\n identity: 'Identity',\n address: 'Address',\n stats: 'Stats',\n history: 'History',\n password: 'Password',\n change_password: 'Change Password',\n },\n page: {\n delete: 'Delete Customer',\n },\n errors: {\n password_mismatch:\n 'The password confirmation is not the same as the password.',\n },\n },\n commands: {\n name: 'Order |||| Orders',\n amount: '1 order |||| %{smart_count} orders',\n title: 'Order %{reference}',\n fields: {\n basket: {\n delivery: 'Delivery',\n reference: 'Reference',\n quantity: 'Quantity',\n sum: 'Sum',\n tax_rate: 'Tax Rate',\n total: 'Total',\n unit_price: 'Unit Price',\n },\n customer_id: 'Customer',\n date_gte: 'Passed Since',\n date_lte: 'Passed Before',\n total_gte: 'Min amount',\n status: 'Status',\n returned: 'Returned',\n },\n },\n invoices: {\n name: 'Invoice |||| Invoices',\n fields: {\n date: 'Invoice date',\n customer_id: 'Customer',\n command_id: 'Order',\n date_gte: 'Passed Since',\n date_lte: 'Passed Before',\n total_gte: 'Min amount',\n address: 'Address',\n },\n },\n products: {\n name: 'Poster |||| Posters',\n fields: {\n category_id: 'Category',\n height_gte: 'Min height',\n height_lte: 'Max height',\n height: 'Height',\n image: 'Image',\n price: 'Price',\n reference: 'Reference',\n stock_lte: 'Low Stock',\n stock: 'Stock',\n thumbnail: 'Thumbnail',\n width_gte: 'Min width',\n width_lte: 'Max width',\n width: 'Width',\n },\n tabs: {\n image: 'Image',\n details: 'Details',\n description: 'Description',\n reviews: 'Reviews',\n },\n },\n categories: {\n name: 'Category |||| Categories',\n fields: {\n products: 'Products',\n },\n },\n reviews: {\n name: 'Review |||| Reviews',\n amount: '1 review |||| %{smart_count} reviews',\n relative_to_poster: 'Review on poster',\n detail: 'Review detail',\n fields: {\n customer_id: 'Customer',\n command_id: 'Order',\n product_id: 'Product',\n date_gte: 'Posted since',\n date_lte: 'Posted before',\n date: 'Date',\n comment: 'Comment',\n rating: 'Rating',\n },\n action: {\n accept: 'Accept',\n reject: 'Reject',\n },\n notification: {\n approved_success: 'Review approved',\n approved_error: 'Error: Review not approved',\n rejected_success: 'Review rejected',\n rejected_error: 'Error: Review not rejected',\n },\n },\n segments: {\n name: 'Segment |||| Segments',\n fields: {\n customers: 'Customers',\n name: 'Name',\n },\n data: {\n compulsive: 'Compulsive',\n collector: 'Collector',\n ordered_once: 'Ordered once',\n regular: 'Regular',\n returns: 'Returns',\n reviewer: 'Reviewer',\n },\n },\n },\n};\n\nexport default customEnglishMessages;\n","import {\n LOG_OUT,\n SET_CURRENT_TABLE_DATA,\n SET_KEYCLOAK_AUTHENTICATED,\n SET_KEYCLOAK_READY,\n SET_ORDERS_RETRIEVED,\n SET_TOKENS,\n SET_URLS\n} from './actionTypes';\nimport {setAuthProviderToken} from '../authProvider';\n\nexport const setKeycloakAuthenticated = authenticated => {\n return {\n type: SET_KEYCLOAK_AUTHENTICATED,\n authenticated\n }\n};\n\nexport const setKeycloakReady = () => {\n return {\n type: SET_KEYCLOAK_READY\n }\n};\n\nexport const setOrdersRetrieved = () => {\n return {\n type: SET_ORDERS_RETRIEVED\n }\n};\n\nexport const setCurrentTableData = currentList => {\n return {\n type: SET_CURRENT_TABLE_DATA,\n currentList\n };\n};\n\nexport const setTokens = tokens => {\n setAuthProviderToken(tokens.token);\n return {\n type: SET_TOKENS,\n tokens\n };\n};\n\nexport function logOutUser() {\n return {\n type: LOG_OUT\n }\n}\n\nexport const setUrls = urls => {\n return {\n type: SET_URLS,\n urls\n };\n};\n","// Auth\nexport const LOG_OUT = 'LOG_OUT';\nexport const SET_CURRENT_TABLE_DATA = 'SET_CURRENT_TABLE_DATA';\nexport const SET_KEYCLOAK_AUTHENTICATED = 'SET_KEYCLOAK_AUTHENTICATED';\nexport const SET_KEYCLOAK_READY = 'SET_KEYCLOAK_READY';\nexport const SET_ORDERS_RETRIEVED = 'SET_ORDERS_RETRIEVED';\nexport const SET_KEYCLOAK_TOKENS = 'SET_KEYCLOAK_TOKENS';\nexport const SET_TOKENS = 'SET_TOKENS';\nexport const SET_URLS = 'SET_URLS';\n","import React, {useCallback, useEffect} from 'react';\nimport {connect} from 'react-redux';\nimport axios from 'axios';\nimport {logOutUser, setKeycloakAuthenticated, setKeycloakReady, setTokens} from '../store/actions';\nimport Emitter from './eventEmitter';\n\nlet tokenTimer;\n\n/**\n * Component for processing Keycloak events and tokens\n *\n * @param keycloak\n * @param props\n * @returns {JSX.Element}\n * @constructor\n */\nconst KeycloakHandler = ({keycloak, ...props}) => {\n\n const setTokenTimer = () => {\n tokenTimer = setInterval(function() {\n let expired = keycloak.isTokenExpired();\n if (keycloak.didInitialize && expired) {\n clearInterval(tokenTimer);\n keycloak.updateToken();\n setTokenTimer();\n }\n }, 5000);\n };\n\n // Callback: Login User\n const loginUserCallback = useCallback((url) => {\n keycloak.login({\n action: 'login',\n redirectUri: url,\n });\n\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n // Callback: Update Token\n const updateTokenCallback = useCallback(() => {\n keycloak.updateToken();\n\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n // Callback: Logout User\n const logoutUserCallback = useCallback(() => {\n localStorage.removeItem('destination');\n props.logOutUser();\n if (keycloak) {\n keycloak.logout();\n }\n\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n // Effect: Set Keycloak as ready upon event\n useEffect(() => {\n const setKeycloakIsReady = () => {\n props.setKeycloakReady()\n };\n\n Emitter.on('keycloakReady', setKeycloakIsReady);\n return () => Emitter.off('keycloakReady', setKeycloakIsReady);\n\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n // Effect: Set Keycloak User as authenticated\n useEffect(() => {\n const setUserAuthenticated = (e) => {\n props.setKeycloakAuthenticated(e);\n };\n\n Emitter.on('keycloakAuthenticated', (e) => setUserAuthenticated(e));\n return () => Emitter.off('keycloakAuthenticated', (e) => setUserAuthenticated(e));\n\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n // Effect: Store tokens in Redux when received\n useEffect(() => {\n const storeToken = (props, token) => {\n if (token) {\n // Set Authorization header for all Axios calls\n axios.defaults.headers.common['Authorization'] = `Bearer ${token}`;\n props.setTokens({token: token});\n }\n };\n\n Emitter.on('accessToken', (e) => storeToken(props, e));\n return () => Emitter.off('accessToken', (e) => storeToken(props, e));\n\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n // Effect: Handle token update prompt\n useEffect(\n () => {\n const handleUpdate = () => {\n updateTokenCallback();\n };\n\n Emitter.on('updateKeycloak', handleUpdate);\n return () => Emitter.off('updateKeycloak', handleUpdate);\n\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n // Effect: Handle expired token\n useEffect(\n () => {\n const handleLogin = (url) => {\n loginUserCallback(url);\n };\n\n Emitter.on('loginKeycloak', (e) => handleLogin(e));\n return () => Emitter.off('loginKeycloak', (e) => handleLogin(e));\n\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n // Effect: Handle expired token\n useEffect(\n () => {\n const handleLogout = () => {\n logoutUserCallback();\n };\n\n Emitter.on('logoutUser', handleLogout);\n return () => Emitter.off('logoutUser', handleLogout);\n\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n // Effect: Handle expired token\n useEffect(\n () => {\n const handleTokenExpired = () => {\n logoutUserCallback();\n };\n\n Emitter.on('tokenExpired', handleTokenExpired);\n return () => Emitter.off('tokenExpired', handleTokenExpired);\n\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n if (!tokenTimer) {\n setTokenTimer();\n }\n\n return (\n <>\n </>\n )\n};\n\nconst mapStateToProps = (state) => {\n return {\n keycloakAuthenticated: state.keycloakState.keycloakAuthenticated,\n tokens: {\n token: state.tokens.token\n }\n };\n};\n\nconst mapDispatchToProps = {\n logOutUser: logOutUser,\n setKeycloakAuthenticated: setKeycloakAuthenticated,\n setKeycloakReady: setKeycloakReady,\n setTokens: setTokens\n};\n\nexport default connect(\n mapStateToProps,\n mapDispatchToProps\n)(KeycloakHandler);\n","import * as React from \"react\";\nimport {AppBar} from 'react-admin';\nimport PTheme from '../global/theme';\nimport Typography from '@material-ui/core/Typography';\nimport {makeStyles} from '@material-ui/core/styles';\n\nconst useStyles = makeStyles({\n toolbar: {\n backgroundColor: PTheme.palette.primary1Color\n },\n title: {\n flex: 1,\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n overflow: 'hidden'\n },\n spacer: {\n flex: 1\n },\n});\n\nconst ParrotAppBar = props => {\n const classes = useStyles();\n return (\n <AppBar className={classes.toolbar} userMenu={<></>} {...props}>\n <Typography\n variant=\"h6\"\n color=\"inherit\"\n className={classes.title}\n id=\"react-admin-title\"\n />\n <span className={classes.spacer}/>\n </AppBar>\n );\n};\n\nexport default ParrotAppBar;\n","import React from 'react';\nimport {Sidebar} from 'react-admin';\nimport {makeStyles} from '@material-ui/core/styles';\n\nconst useSidebarStyles = makeStyles({\n drawerPaper: {\n margin: 0,\n padding: '10px 0 0 0'\n },\n});\n\n/**\n * Sidebar\n *\n * @param props\n * @return {*}\n * @constructor\n */\nconst ParrotSidebar = (props) => {\n const classes = useSidebarStyles();\n return (\n <Sidebar classes={classes} {...props} />\n );\n};\n\nexport default ParrotSidebar;\n","import React from \"react\";\nimport {ListButton, ShowButton, TopToolbar} from \"react-admin\";\n\n/**\n * Custom Edit Actions Toolbar\n *\n * @param basePath\n * @param className\n * @param data\n * @param hasList\n * @param hasShow\n * @param resource\n * @returns {JSX.Element}\n * @constructor\n */\nconst EditActions = ({\n basePath,\n className,\n data,\n hasList,\n hasShow,\n resource\n }) => {\n // @TODO add description/instructions, modify layout\n return (\n <>\n <TopToolbar className={className}>\n {hasList && <ListButton basePath={basePath}/>}\n {hasShow && <ShowButton basePath={basePath} record={data}/>}\n </TopToolbar>\n </>\n )\n};\n\nexport default EditActions;\n","import React from 'react';\nimport {Edit as ReactAdminEdit} from 'react-admin';\nimport EditActions from './EditActions';\n\nconst Edit = ReactAdminEdit;\n\nEdit.defaultProps = {\n actions: <EditActions/>,\n undoable: false,\n};\n\nexport default Edit;\n","import React from \"react\";\nimport {ListButton, EditButton, TopToolbar} from \"react-admin\";\n\n/**\n * Custom Show Actions Toolbar\n *\n * @param basePath\n * @param className\n * @param data\n * @param hasEdit\n * @param hasList\n * @param resource\n * @returns {JSX.Element}\n * @constructor\n */\nconst ShowActions = ({\n basePath,\n className,\n data,\n hasEdit,\n hasList,\n resource\n }) => {\n // @TODO add description/instructions, modify layout\n return (\n <>\n <TopToolbar className={className}>\n {hasList && <ListButton basePath={basePath}/>}\n {hasEdit && <EditButton basePath={basePath} record={data}/>}\n </TopToolbar>\n </>\n )\n};\n\nexport default ShowActions;\n","import React from 'react';\nimport {Show as ReactAdminShow} from 'react-admin';\nimport ShowActions from './ShowActions';\n\nconst Show = ReactAdminShow;\n\nShow.defaultProps = {\n actions: <ShowActions/>\n};\n\nexport default Show;\n","import React, {useCallback, useEffect, useMemo, useRef, useState} from 'react';\nimport PropTypes from 'prop-types';\nimport {connect} from 'react-redux';\nimport {useTable, usePagination, useFilters, useSortBy} from 'react-table';\nimport {useListContext} from 'react-admin';\nimport {setCurrentTableData} from '../../store/actions';\nimport IconSortArrowDown from '../../css/images/IconSortArrowDown';\nimport IconSortArrowUp from '../../css/images/IconSortArrowUp';\nimport ListLoading from '../ListLoading';\nimport ListMessage from '../ListMessage';\nimport {DefaultColumnFilter} from '../../utils/tableFunctions';\nimport CssBaseline from '@material-ui/core/CssBaseline';\nimport MaUTable from '@material-ui/core/Table';\nimport TableBody from '@material-ui/core/TableBody';\nimport TableCell from '@material-ui/core/TableCell';\nimport TableHead from '@material-ui/core/TableHead';\nimport TablePagination from '@material-ui/core/TablePagination';\nimport TableRow from '@material-ui/core/TableRow';\n\n/**\n * A component that renders a React Table from React-Admin data structure\n *\n * @param props\n * @return {JSX.Element|null}\n * @constructor\n */\nconst DataTable = (props) => {\n const {\n columns,\n perPage,\n sort,\n listFilters = null,\n listFilter = null,\n messageEmpty = '',\n messageFilter = '',\n instructions = '',\n manualQuickFilters,\n manualSortAndPagination,\n setCurrentTableData,\n storeForExport\n } = props;\n\n const {\n basePath,\n data,\n filterValues,\n ids,\n loaded,\n setFilters,\n setPage,\n setSort,\n total\n } = useListContext(props);\n\n const [dataList, setDataList] = useState([]);\n const [currentTableList, setCurrentTableList] = useState([]);\n const [manualPageIndex, setManualPageIndex] = useState(0);\n\n const lastFilterRef = useRef(null);\n\n // Callback: Store current table data in Redux\n const storeCurrentTableData = useCallback((currentList) => {\n setCurrentTableData(currentList);\n }, [setCurrentTableData]);\n\n // Effect: Update table list state upon new data\n useEffect(() => {\n // Create an array of data the table can use based on React-Admin's ids and data\n const setTableData = () => {\n let list = [];\n let idLength = ids.length;\n if (idLength > 0) {\n // Assemble an array based on React-Admin ids and data\n for (let i = 0; i < idLength; i++) {\n let id = ids[i];\n let item = data[id];\n if (item && item.id !== '') {\n list.push(item);\n }\n }\n }\n setDataList(list);\n };\n\n return setTableData();\n\n }, [ids, data]);\n\n // Memoized Table Data\n const tableData = useMemo(() => dataList, [dataList]);\n\n // Memoized Table Columns\n const tableColumns = useMemo(\n () => columns, [columns]\n )\n\n // Default Sort column\n const sortBy = (sort) ? {id: sort.field, desc: (sort.order) === 'DESC'} : {id: 'id', desc: false};\n\n // Initial sort & pagination values\n const initialState = {\n pageIndex: 0,\n pageSize: (perPage) ? perPage : 20,\n sortBy: [sortBy]\n };\n\n // Default Filter\n const defaultColumn = useMemo(\n () => ({\n Filter: DefaultColumnFilter,\n }), []\n );\n\n // Table Definition\n const {\n getTableProps,\n getTableBodyProps,\n headerGroups,\n prepareRow,\n page,\n rows,\n gotoPage,\n state: {pageIndex}\n } = useTable(\n {\n columns: tableColumns,\n data: tableData,\n defaultColumn: defaultColumn,\n initialState: initialState,\n manualFilters: manualQuickFilters,\n manualPagination: manualSortAndPagination,\n manualSortBy: manualSortAndPagination\n },\n useFilters,\n useSortBy,\n usePagination\n );\n\n // Effect: Store currently filtered and sorted rows\n useEffect(() => {\n const storeCurrentRows = () => {\n let list = [];\n if (page.length > 0) {\n page.forEach(function (row, idx) {\n if (row.original?.id) {\n list.push(row.original);\n }\n });\n }\n const isNew = (JSON.stringify(list) !== JSON.stringify(currentTableList));\n if (list.length > 0 && isNew) {\n setCurrentTableList(list);\n storeCurrentTableData(list);\n }\n };\n\n if (storeForExport && page && page.length > 0) {\n storeCurrentRows();\n }\n }, [page, currentTableList, storeForExport, storeCurrentTableData]);\n\n // Display loading before resource has responded\n if (loaded === false) {\n return (\n <ListLoading/>\n )\n }\n\n // Pass sort click to parent if sorting is manual\n const handleManualSort = (id, sortBy, isSorted, isSortedDesc) => {\n const sortOrder = (isSorted) ? (isSortedDesc) ? 'DESC' : 'ASC' : 'ASC';\n const sortValue = (sortBy) ? sortBy : id;\n setSort(sortValue, sortOrder);\n if (manualPageIndex > 0) {\n setPage(1);\n setManualPageIndex(0);\n }\n };\n\n // Pass pagination click to parent if pagination is manual\n const handleManualPagination = (newPage) => {\n const toPage = Number(newPage);\n setPage(toPage + 1);\n setManualPageIndex(toPage);\n };\n\n const handleManualQuickFilters = (e, id, value) => {\n lastFilterRef.current = (value && value !== '') ? id : null;\n const updatedFilters = JSON.parse(JSON.stringify(filterValues));\n updatedFilters['s_' + id] = value;\n setFilters(updatedFilters, undefined, true);\n };\n\n // Set additional data to pass to cells\n const cellProps = {\n basePath: basePath\n };\n\n // Display message or prompt if empty\n let message;\n if (loaded && (ids.length === 0 || total === 0)) {\n if (listFilters && listFilter && props[listFilters] && props[listFilters][listFilter] && messageEmpty) {\n message = messageEmpty;\n } else if (listFilters && listFilter) {\n message = messageFilter;\n } else {\n message = messageEmpty;\n }\n }\n\n // Render table\n return (\n <>\n {instructions &&\n <p className=\"data-table-instructions\">{instructions}</p>\n }\n {message &&\n <ListMessage text={message}/>\n }\n <div className=\"list-table-container\">\n <CssBaseline/>\n <MaUTable {...getTableProps()} size=\"small\" className=\"list-table\">\n\n <TableHead>\n {headerGroups.map(headerGroup => (\n <TableRow {...headerGroup.getHeaderGroupProps()}>\n {headerGroup.headers.map(column => (\n <TableCell {...column.getHeaderProps()} key={`cell-${column.id}`}>\n {/* Table Header Label & Sort */}\n <div {...column.getSortByToggleProps()}\n {...manualSortAndPagination && {\n onClick: () => handleManualSort(column.id, column.sortBy, column.isSorted, column.isSortedDesc)\n }}\n >\n {column.render('Header')}\n {column.canSort &&\n <span className=\"sort-icon\">\n {column.isSorted\n ? column.isSortedDesc\n ? <IconSortArrowDown/>\n : <IconSortArrowUp/>\n : <IconSortArrowDown classes=\"disabled\"/>}\n </span>\n }\n </div>\n {/* Table Header Filter */}\n <div className=\"column-filter\">\n {column.canFilter && !manualQuickFilters\n ? column.render('Filter')\n : null\n }\n {column.canFilter && manualQuickFilters\n ? column.render(({column}) => (\n <input\n key={`s_${column.id}`}\n id={`s_${column.id}`}\n name={`s_${column.id}`}\n defaultValue={(filterValues && filterValues['s_' + column.id]) || undefined}\n autoFocus={!!(lastFilterRef.current && lastFilterRef.current === column.id)}\n onChange={e => {\n e.preventDefault();\n handleManualQuickFilters(e, column.id, e.target.value);\n }}\n placeholder=\"Search\"\n className=\"table-filter-default\"\n style={{display: 'block'}}\n />\n ))\n : null\n }\n </div>\n </TableCell>\n ))}\n </TableRow>\n ))}\n </TableHead>\n\n {/* Table Body with paginated rows */}\n <TableBody {...getTableBodyProps()}>\n {page.map((row, i) => {\n prepareRow(row)\n return (\n <TableRow {...row.getRowProps()}>\n {row.cells.map(cell => {\n const tdClass = (cell.column.ClassName) ? cell.column.ClassName : undefined;\n return (\n <TableCell {...cell.getCellProps()} className={tdClass}>\n {cell.render('Cell', cellProps)}\n </TableCell>\n )\n })}\n </TableRow>\n )\n })}\n </TableBody>\n </MaUTable>\n\n {/* Table Pagination with optional manual pagination */}\n <TablePagination\n component=\"div\"\n count={(manualSortAndPagination) ? total : rows.length}\n page={(manualSortAndPagination) ? manualPageIndex : pageIndex}\n rowsPerPage={initialState.pageSize}\n rowsPerPageOptions={[]}\n onPageChange={(e, newPage) => {\n if (manualSortAndPagination) {\n handleManualPagination(newPage);\n } else {\n gotoPage((newPage) ? Number(newPage) : 0);\n }\n }}\n />\n </div>\n </>\n )\n};\n\nconst mapDispatchToProps = {\n setCurrentTableData: setCurrentTableData\n};\n\nDataTable.propTypes = {\n basePath: PropTypes.string,\n body: PropTypes.element,\n children: PropTypes.node,\n classes: PropTypes.object,\n className: PropTypes.string,\n currentSort: PropTypes.shape({\n field: PropTypes.string,\n order: PropTypes.string,\n }),\n data: PropTypes.object,\n instructions: PropTypes.string,\n manualQuickFilters: PropTypes.bool,\n manualSortAndPagination: PropTypes.bool,\n onUpdate: PropTypes.func,\n storeForExport: PropTypes.bool,\n // Ignored\n expand: PropTypes.oneOfType([PropTypes.element, PropTypes.elementType]),\n hasBulkActions: PropTypes.bool,\n hover: PropTypes.bool,\n ids: PropTypes.arrayOf(PropTypes.any),\n loading: PropTypes.bool,\n onSelect: PropTypes.func,\n onToggleItem: PropTypes.func,\n resource: PropTypes.string,\n rowClick: PropTypes.oneOfType([PropTypes.string, PropTypes.func]),\n rowStyle: PropTypes.func,\n selectedIds: PropTypes.arrayOf(PropTypes.any),\n setPage: PropTypes.func,\n setPerPage: PropTypes.func,\n setSort: PropTypes.func,\n total: PropTypes.number,\n version: PropTypes.number,\n isRowSelectable: PropTypes.func,\n};\n\nDataTable.defaultProps = {\n manualQuickFilters: false,\n manualSortAndPagination: false,\n storeForExport: false\n};\n\nexport default connect(\n null,\n mapDispatchToProps\n)(DataTable);\n","import * as React from \"react\";\nimport {\n List,\n Create,\n Filter,\n SimpleList,\n SimpleShowLayout,\n SimpleForm,\n Toolbar,\n BooleanField,\n TextField,\n SelectInput,\n TextInput,\n SaveButton,\n required\n} from 'react-admin';\nimport Edit from '../components/admin/Edit';\nimport Show from '../components/admin/Show';\nimport DataTable from '../components/admin/DataTable';\nimport FieldDescription from '../components/FieldDescription';\nimport FieldDivider from '../components/FieldDivider';\nimport SelectFromListInput from \"../components/SelectFromListInput\";\nimport {CONTACT_COLUMNS} from '../global/listColumns';\nimport {editButtonColumnObject, showButtonColumnObject} from '../utils/tableFunctions';\nimport {viewStyles} from '../global/styles';\nimport {useMediaQuery} from '@material-ui/core';\nimport {makeStyles} from '@material-ui/core/styles';\nimport Avatar from '@material-ui/core/Avatar';\nimport PermContactCalendarIcon from '@material-ui/icons/PermContactCalendar';\n\nexport const ContactIcon = PermContactCalendarIcon;\n\nconst useToolbarStyles = makeStyles({\n toolbar: {\n display: 'flex',\n justifyContent: 'space-between'\n },\n});\n\nconst validateName = [required()];\n\n/**\n * View: List\n */\n\nconst ListFilter = (props) => (\n <Filter {...props}>\n <SelectFromListInput\n inAdminForm={true}\n source=\"filter_org_id\"\n resourceName=\"Organization\"\n listLabel=\"Select Client\"\n itemPlural=\"Clients\"\n returnType=\"string\"\n listFilters={{\n active: props.filterValues.active\n }}\n isRequired={false}\n alwaysOn\n size=\"small\"\n hasClear={false}\n className=\"input-320\"\n />\n <SelectInput\n source=\"active\" label=\"Active\"\n choices={[\n {id: true, name: 'Yes'},\n {id: false, name: 'No'},\n ]}\n alwaysOn\n allowEmpty={false}\n />\n </Filter>\n);\n\nconst ListTitle = <span><Avatar style={viewStyles.avatar} className=\"avatar-title\"\n alt=\"Contacts\"><ContactIcon style={viewStyles.avatarSvg}/></Avatar>Contacts</span>;\n\nconst showButtonColumn = showButtonColumnObject();\nconst editButtonColumn = editButtonColumnObject();\n\nconst listColumns = [...CONTACT_COLUMNS, showButtonColumn, editButtonColumn];\n\nconst listSort = {field: 'name', order: 'ASC'};\n\nexport const ContactList = (props) => {\n const isSmall = useMediaQuery(theme => theme.breakpoints.down('sm'));\n return (\n <List title={ListTitle}\n sort={listSort}\n perPage={12}\n filters={<ListFilter/>}\n filterDefaultValues={{active: true, filter_org_id: ''}}\n bulkActionButtons={false}\n pagination={false}\n {...props}\n >\n {isSmall ? (\n <SimpleList\n primaryText={record => record.name}\n secondaryText={record => record.city + ', ' + record.state}\n tertiaryText={record => record.id}\n />\n ) : (\n <DataTable\n columns={listColumns}\n sort={listSort}\n listFilters=\"filterValues\"\n listFilter=\"filter_org_id\"\n messageFilter=\"Select a Client to view Contacts.\"\n messageEmpty=\" No Contacts found.\"\n {...props}\n />\n )}\n </List>\n )\n};\n\n/**\n * View: Show\n */\n\nconst ShowTitle = ({record}) => {\n return <span><Avatar style={viewStyles.avatar} className=\"avatar-title\"\n alt=\"Contacts\"><ContactIcon\n style={viewStyles.avatarSvg}/></Avatar>{record ? `${record.name}` : 'Contact'}</span>;\n};\n\nexport const ContactShow = (props) => (\n <Show title={<ShowTitle/>} {...props}>\n <SimpleShowLayout className=\"show-layout\">\n <FieldDescription\n instructions={true} marginBottom={true}\n text={`\n Review Contact details below. To edit this Contact, click Edit above.\n `}\n />\n <TextField label=\"Company\" source=\"name\" className=\"field-bg\"/>\n <TextField label=\"First Name\" source=\"first_name\" className=\"field-bg input-inline half\"/>\n <TextField label=\"Last Name\" source=\"last_name\" className=\"field-bg input-inline half\"/>\n <TextField label=\"Address\" source=\"address\" className=\"field-bg\"/>\n <TextField label=\"Address 2\" source=\"address2\" className=\"field-bg\"/>\n <TextField label=\"City\" source=\"city\" className=\"input-inline input-180\"/>\n <TextField label=\"State\" source=\"state\" className=\"input-inline input-120\"/>\n <TextField label=\"ZIP/Postal Code\" source=\"zip\" className=\"input-inline input-120\"/>\n <TextField label=\"Country\" source=\"country\" className=\"input-inline input-220\"/>\n <FieldDivider type=\"break\"/>\n <TextField label=\"Email Address\" source=\"email\" className=\"field-bg input-inline half\"/>\n <TextField label=\"Phone\" source=\"phone\" className=\"field-bg input-inline half\"/>\n <BooleanField label=\"Active\" source=\"active\"/>\n </SimpleShowLayout>\n </Show>\n);\n\n/**\n * View: Create\n */\n\nconst CreateTitle = <span><Avatar icon={<ContactIcon/>} style={viewStyles.avatar}\n className=\"avatar-title\"/>Create a Contact</span>;\n\nexport const ContactCreate = (props) => (\n <Create title={CreateTitle} {...props}>\n <SimpleForm redirect=\"list\" submitOnEnter={false}>\n <FieldDescription\n instructions={true} marginBottom={true}\n text={`\n Add a Contact by selecting a Client and entering details below.\n `}\n />\n <SelectFromListInput\n inAdminForm={true}\n source=\"org_id\"\n resourceName=\"Organization\"\n listLabel=\"Select a Client\"\n itemPlural=\"Clients\"\n listFilters={{\n active: true\n }}\n returnType=\"string\"\n className=\"input-full\"\n isRequired={true}\n hasClear={false}\n />\n <FieldDivider type=\"break\" margin=\"bottom\"/>\n <TextInput label=\"Company\" source=\"name\"\n helperText=\"Enter the company name of the Contact. This may be a business name or the full name of a person.\"\n fullWidth={true} validate={validateName}/>\n <TextInput label=\"First Name\" source=\"first_name\" formClassName=\"input-inline half\"/>\n <TextInput label=\"Last Name\" source=\"last_name\" formClassName=\"input-inline half\"/>\n <TextInput label=\"Address\" source=\"address\" fullWidth={true}/>\n <TextInput label=\"Address 2\" source=\"address2\" fullWidth={true}/>\n <TextInput label=\"City\" source=\"city\" formClassName=\"input-inline third\"/>\n <TextInput label=\"State\" source=\"state\" formClassName=\"input-inline third\"/>\n <TextInput label=\"ZIP/Postal Code\" source=\"zip\" formClassName=\"input-inline third\"/>\n <TextInput label=\"Country\" source=\"country\" formClassName=\"input-inline half\"/>\n <FieldDivider type=\"break\"/>\n <TextInput label=\"Email Address\" source=\"email\" formClassName=\"input-inline half\"/>\n <TextInput label=\"Phone\" source=\"phone\" formClassName=\"input-inline half\"/>\n <TextInput label=\"Notes\" source=\"notes\" multiline fullWidth={true}/>\n <SelectInput source=\"active\" label=\"Active\"\n choices={[\n {id: true, name: 'Yes'},\n {id: false, name: 'No'},\n ]}\n allowEmpty={false}\n />\n\n <FieldDescription\n description={true}\n text=\"After clicking Save, you will be redirected to the Contacts List.\"\n />\n </SimpleForm>\n </Create>\n);\n\n/**\n * View: Edit\n */\n\nconst EditTitle = ({record}) => {\n return <span><Avatar icon={<ContactIcon/>} style={viewStyles.avatar}\n className=\"avatar-title\"/>Edit {record ? `${record.name}` : 'Contact'}</span>;\n};\n\nconst EditToolbar = props => (\n <Toolbar {...props} classes={useToolbarStyles()}>\n <SaveButton/>\n </Toolbar>\n);\n\nexport const ContactEdit = (props) => (\n <Edit title={<EditTitle/>} {...props}>\n <SimpleForm submitOnEnter={false} toolbar={<EditToolbar/>}>\n <FieldDescription\n instructions={true} marginBottom={true}\n text={`Edit Contact details below.`}\n />\n <TextInput label=\"Company\" source=\"name\" fullWidth={true} validate={validateName}/>\n <TextInput label=\"First Name\" source=\"first_name\" formClassName=\"input-inline half\"/>\n <TextInput label=\"Last Name\" source=\"last_name\" formClassName=\"input-inline half\"/>\n <TextInput label=\"Address\" source=\"address\" fullWidth={true}/>\n <TextInput label=\"Address 2\" source=\"address2\" fullWidth={true}/>\n <TextInput label=\"City\" source=\"city\" formClassName=\"input-inline third\"/>\n <TextInput label=\"State\" source=\"state\" formClassName=\"input-inline third\"/>\n <TextInput label=\"ZIP/Postal Code\" source=\"zip\" formClassName=\"input-inline third\"/>\n <TextInput label=\"Country\" source=\"country\" formClassName=\"input-inline half\"/>\n <FieldDivider type=\"break\"/>\n <TextInput label=\"Email Address\" source=\"email\" formClassName=\"input-inline half\"/>\n <TextInput label=\"Phone\" source=\"phone\" formClassName=\"input-inline half\"/>\n <TextInput label=\"Notes\" source=\"notes\" multiline fullWidth={true}/>\n <FieldDescription\n description={true}\n text=\"If this Contact should no longer be referenced, mark it as Inactive.\"\n />\n <SelectInput source=\"active\" label=\"Active\"\n choices={[\n {id: true, name: 'Yes'},\n {id: false, name: 'No'},\n ]}\n allowEmpty={false}\n />\n <FieldDescription\n description={true}\n text=\"After clicking Save, you will be redirected to the Contacts List.\"\n />\n </SimpleForm>\n </Edit>\n);\n","import React from 'react';\nimport Box from '@material-ui/core/Box';\nimport Typography from '@material-ui/core/Typography';\n\nconst ListEmpty = (props) => {\n return (\n <Box textAlign=\"center\" m={1}>\n <Typography variant=\"h6\" paragraph>\n No {props.namePlural} found. Create {props.connector} {props.nameSingle} above.\n </Typography>\n </Box>\n )\n};\n\nexport default ListEmpty;\n","import React, {useEffect, useState} from 'react';\nimport Emitter from '../utils/eventEmitter';\nimport ProductDetailDialog from '../components/ProductDetailDialog';\n\n/**\n * A component to contain a Product Detail Dialog\n *\n * @return {JSX.Element}\n * @constructor\n */\nconst ProductDetailDialogContainer = () => {\n\n const [itemDetailState, setItemDetailState] = useState({\n dialog: false,\n id: null\n });\n\n useEffect(\n () => {\n const setProductId = (e) => {\n setItemDetailState({\n dialog: true,\n id: e\n });\n };\n\n // Add a listener to store when Keycloak is ready\n Emitter.on('selectedProductId', (e) => setProductId(e));\n\n return () => Emitter.off('selectedProductId', (e) => setProductId(e));\n\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []\n );\n\n const handleCloseItemDialog = () => {\n setItemDetailState({dialog: false, id: null});\n };\n\n return (\n <ProductDetailDialog\n openDialog={itemDetailState.dialog}\n productId={(itemDetailState.id) ? itemDetailState.id : null}\n onCloseFunc={handleCloseItemDialog}\n />\n )\n}\n\nexport default ProductDetailDialogContainer;\n","import React from 'react';\nimport {\n List,\n Filter,\n SimpleList,\n SimpleShowLayout,\n BooleanField,\n TextField,\n SelectInput,\n TextInput\n} from 'react-admin';\nimport Emitter from '../utils/eventEmitter';\nimport Show from '../components/admin/Show';\nimport DataTable from '../components/admin/DataTable';\nimport FieldDescription from '../components/FieldDescription';\nimport FieldDivider from '../components/FieldDivider';\nimport ListEmpty from '../components/ListEmpty';\nimport ProductDetailDialogContainer from '../components/ProductDetailDialogContainer';\nimport ProductImage from '../components/ProductImage';\nimport ProductThumbnail from '../components/ProductThumbnail';\nimport SelectFromListInput from '../components/SelectFromListInput';\nimport {showButtonColumnObject} from '../utils/tableFunctions';\nimport {viewStyles} from '../global/styles';\nimport {tableStyles} from '../global/tableStyles';\nimport {useMediaQuery} from '@material-ui/core';\nimport Avatar from '@material-ui/core/Avatar';\nimport CategoryIcon from '@material-ui/icons/Category';\nimport IconButton from '@material-ui/core/IconButton';\nimport InfoIcon from '@material-ui/icons/Info';\n\nexport const ProductIcon = CategoryIcon;\n\n/**\n * View: List\n */\n\nconst ListFilter = (props) => (\n <Filter {...props}>\n <TextInput\n key=\"filter_sku\"\n label=\"Search by Product SKU\"\n source=\"filter_sku\"\n placeholder=\"SKU-N00012345\"\n alwaysOn\n className=\"input-180\"\n />\n <TextInput\n key=\"filter_title\"\n label=\"Search Product Name\"\n source=\"filter_title\"\n alwaysOn\n />\n <SelectInput\n key=\"filter_active\" source=\"active\" label=\"Active\"\n choices={[\n {id: true, name: 'Yes'},\n {id: false, name: 'No'},\n ]}\n alwaysOn\n allowEmpty={false}\n className=\"input-90\"\n />\n <SelectInput\n key=\"filter_by\" source=\"filter_by\" label=\"Filter By:\"\n choices={[\n {id: 'client', name: 'Client'},\n {id: 'show', name: 'Title'},\n {id: 'product_type', name: 'Category'}\n ]}\n alwaysOn\n allowEmpty={true}\n className=\"input-120\"\n />\n <SelectFromListInput\n inAdminForm={true}\n source=\"filter_product_type_id\"\n resourceName=\"ProductType\"\n listLabel=\"By Category\"\n itemPlural=\"Categories\"\n returnType=\"string\"\n listFilters={{\n active: props.filterValues.active\n }}\n isRequired={false}\n alwaysOn\n size=\"small\"\n hasClear={true}\n className={(props.filterValues.filter_by && props.filterValues.filter_by === 'product_type') ? 'input-select-list' : 'input-hidden'}\n />\n <SelectFromListInput\n inAdminForm={true}\n source=\"filter_org_id\"\n resourceName=\"Organization\"\n listLabel=\"By Client\"\n itemPlural=\"Clients\"\n returnType=\"string\"\n listFilters={{\n active: true\n }}\n isRequired={false}\n alwaysOn\n size=\"small\"\n hasClear={true}\n className={(props.filterValues.filter_by && props.filterValues.filter_by === 'client') ? 'input-select-list' : 'input-hidden'}\n />\n <SelectFromListInput\n inAdminForm={true}\n source=\"filter_show_id\"\n resourceName=\"Show\"\n listLabel=\"By Title\"\n itemPlural=\"Titles\"\n returnType=\"string\"\n listFilters={{\n active: true\n }}\n isRequired={false}\n alwaysOn\n size=\"small\"\n hasClear={true}\n className={(props.filterValues.filter_by && props.filterValues.filter_by === 'show') ? 'input-select-list' : 'input-hidden'}\n />\n </Filter>\n);\n\nconst ListTitle = <span><Avatar style={viewStyles.avatar} className=\"avatar-title\"\n alt=\"Products\"><ProductIcon style={viewStyles.avatarSvg}/></Avatar>Products</span>;\n\nconst showButtonColumn = showButtonColumnObject();\n\nfunction filterGreaterThan(rows, id, filterValue) {\n return rows.filter(row => {\n return row.values[id] >= filterValue;\n })\n}\n\nfilterGreaterThan.autoRemove = val => typeof val !== 'number';\n\nconst listColumns = [\n {\n Header: 'SKU',\n accessor: 'sku',\n sortType: 'basic',\n Cell: ({row}) => <span style={viewStyles.noWrap}>{(row.original.sku) ? row.original.sku : ''}</span>\n },\n {\n Header: 'Image',\n id: 'thumb',\n Cell: ({row}) => <ProductThumbnail label=\"Image\" title={row.original.title}\n thumbnail={row.original.thumbnail}/>,\n disableFilters: true,\n disableSortBy: true\n },\n {\n Header: 'Client',\n accessor: 'org_name',\n sortType: 'basic',\n Cell: ({row}) => <span\n style={viewStyles.noWrap}>{(row.original.org_name) ? row.original.org_name : ''}</span>\n },\n {\n Header: 'Title',\n accessor: 'show_name',\n sortType: 'basic',\n Cell: ({row}) => <span>{(row.original.show_name) ? row.original.show_name : ''}</span>\n },\n {\n Header: 'Name',\n accessor: 'title',\n sortType: 'basic',\n Cell: ({row}) => <span>{(row.original.title) ? row.original.title : ''}</span>\n },\n {\n Header: 'Parent Category',\n accessor: 'parent_type_name',\n sortType: 'basic',\n Cell: ({row}) => <span>{(row.original.parent_type_name) ? row.original.parent_type_name : ''}</span>\n },\n {\n Header: 'Category',\n accessor: 'type_name',\n sortType: 'basic',\n Cell: ({row}) => <span>{(row.original.type_name) ? row.original.type_name : ''}</span>\n },\n {\n Header: () => (<span style={tableStyles.tdRight}>Qty</span>),\n accessor: 'qty',\n id: 'qty',\n sortType: 'basic',\n disableFilters: true,\n ClassName: 'right',\n width: 80,\n maxWidth: 80,\n Cell: ({row}) => <span>{row.original.qty}</span>\n },\n {\n Header: () => null,\n id: 'list-detail',\n Cell: ({row}) => (\n <span className=\"table-icon-button\">\n <IconButton\n aria-label=\"Quick View\"\n title=\"Quick View\"\n color=\"primary\"\n onClick={() => {\n Emitter.emit('selectedProductId', row.original.id);\n }}\n >\n <InfoIcon/>\n </IconButton>\n </span>\n ),\n width: 80,\n maxWidth: 80,\n disableFilters: true,\n disableSortBy: true\n },\n showButtonColumn\n];\n\nconst listSort = {field: 'title', order: 'ASC'};\n\nexport const ProductList = (props) => {\n const isSmall = useMediaQuery(theme => theme.breakpoints.down('sm'));\n return (\n <>\n <List title={ListTitle}\n sort={listSort}\n perPage={20}\n filters={<ListFilter/>}\n filterDefaultValues={{active: true, filter_by: 'client'}}\n bulkActionButtons={false}\n pagination={false}\n empty={<ListEmpty props={{namePlural: 'Products', nameSingle: 'Product', connector: 'a'}}/>}\n {...props}\n >\n {isSmall ? (\n <SimpleList\n primaryText={record => record.title}\n secondaryText={record => record.description}\n />\n ) : (\n <DataTable\n columns={listColumns}\n sort={listSort}\n listFilters=\"filterValues\"\n listFilter=\"filter_by\"\n messageFilter=\"Search or select a Filter to view Products.\"\n messageEmpty=\" No Products found.\"\n {...props}\n />\n )}\n </List>\n <ProductDetailDialogContainer/>\n </>\n )\n};\n\n/**\n * View: Show\n */\n\nconst ShowTitle = ({record}) => {\n return <span><Avatar style={viewStyles.avatar} className=\"avatar-title\"\n alt=\"Product\"><ProductIcon\n style={viewStyles.avatarSvg}/></Avatar>{record ? `${record.title}` : 'Product'}</span>;\n};\n\nexport const ProductShow = (props) => (\n <Show title={<ShowTitle/>} {...props}>\n <SimpleShowLayout className=\"show-layout\">\n <FieldDescription\n instructions={true} marginBottom={true}\n text={`Review Product details below.`}\n />\n <TextField label=\"ID\" source=\"id\" className=\"input-inline input-280\"/>\n <TextField label=\"SKU\" source=\"sku\" className=\"input-inline input-180\"/>\n <FieldDivider type=\"break\" margin=\"bottom\"/>\n <TextField label=\"Name of Product\" source=\"title\" className=\"field-bg\"/>\n <FieldDivider type=\"break\" margin=\"bottom\"/>\n <TextField label=\"Title\" source=\"show_name\" className=\"input-inline input-280\"/>\n <TextField label=\"Product Category\" source=\"type_display_name\" className=\"input-inline input-320\"/>\n <FieldDivider type=\"break\" margin=\"bottom\"/>\n <ProductImage renderType=\"show\" label=\"Product Image\" allowUpload={false} {...props}/>\n <TextField label=\"Description\" source=\"description\" className=\"field-bg\"/>\n <FieldDivider type=\"divider\" margin=\"bottom\"/>\n <FieldDescription header={true} text={`Total Quantity`}/>\n <TextField label=\"\" source=\"qty\" className=\"input-180\"/>\n <BooleanField label=\"Active\" source=\"active\" className=\"input-inline input-120\"/>\n </SimpleShowLayout>\n </Show>\n);\n","import * as React from \"react\";\nimport {\n List,\n Filter,\n SimpleList,\n SimpleShowLayout,\n BooleanField,\n TextField,\n SelectInput,\n ExportButton,\n ListButton,\n TopToolbar\n} from 'react-admin';\nimport Show from '../components/admin/Show';\nimport DataTable from '../components/admin/DataTable';\nimport ListEmpty from '../components/ListEmpty';\nimport FieldDescription from '../components/FieldDescription';\nimport {TITLE_COLUMNS} from '../global/listColumns';\nimport {showButtonColumnObject} from '../utils/tableFunctions';\nimport {viewStyles} from '../global/styles';\nimport {useMediaQuery} from '@material-ui/core';\nimport Avatar from '@material-ui/core/Avatar';\nimport LocalActivityIcon from '@material-ui/icons/LocalActivity';\n\nexport const ShowIcon = LocalActivityIcon;\n\n/**\n * View: List\n */\n\nconst ListFilter = (props) => (\n <Filter {...props}>\n <SelectInput source=\"active\" label=\"Active\"\n choices={[\n {id: true, name: 'Yes'},\n {id: false, name: 'No'},\n ]}\n alwaysOn\n allowEmpty={false}\n />\n </Filter>\n);\n\nconst ListActions = ({basePath, data}) => {\n return (\n <TopToolbar>\n <ExportButton/>\n </TopToolbar>\n )\n};\n\nconst ListTitle = <span><Avatar style={viewStyles.avatar} className=\"avatar-title\"\n alt=\"Titles\"><ShowIcon style={viewStyles.avatarSvg}/></Avatar>Titles</span>;\n\nconst showButtonColumn = showButtonColumnObject();\n\nconst listColumns = [...TITLE_COLUMNS, showButtonColumn];\n\nconst listSort = {field: 'org_name', order: 'ASC'};\n\nexport const ShowList = (props) => {\n const isSmall = useMediaQuery(theme => theme.breakpoints.down('sm'));\n return (\n <List title={ListTitle}\n sort={listSort}\n perPage={12}\n actions={<ListActions/>}\n filters={<ListFilter/>}\n filterDefaultValues={{active: true}}\n bulkActionButtons={false}\n pagination={false}\n empty={<ListEmpty props={{namePlural: 'Titles', nameSingle: 'Title', connector: 'a'}}/>}\n {...props}\n >\n {isSmall ? (\n <SimpleList\n primaryText={record => record.name}\n secondaryText={record => record.org_name}\n tertiaryText={record => record.id}\n />\n ) : (\n <DataTable columns={listColumns} sort={listSort} messageEmpty=\" No Titles found.\" {...props}/>\n )}\n </List>\n )\n};\n\n/**\n * View: Show\n */\n\nconst ShowActions = ({basePath, data}) => {\n return (\n <TopToolbar>\n <ListButton basePath={basePath}/>\n </TopToolbar>\n )\n};\n\nconst ShowTitle = ({record}) => {\n return <span><Avatar style={viewStyles.avatar} className=\"avatar-title\"\n alt=\"Titles\"><ShowIcon\n style={viewStyles.avatarSvg}/></Avatar>{record ? `${record.name}` : 'Title'}</span>;\n};\n\nexport const ShowShow = (props) => (\n <Show title={<ShowTitle/>} actions={<ShowActions/>} {...props}>\n <SimpleShowLayout className=\"show-layout\">\n <FieldDescription\n instructions={true} marginBottom={true}\n text={`\n Review Title details below.\n `}\n />\n <TextField label=\"Title ID\" source=\"id\" className=\"input-inline input-120\"/>\n <TextField label=\"Client\" source=\"org_name\" className=\"input-inline input-120\"/>\n <TextField label=\"Title Name\" source=\"name\" className=\"field-bg\"/>\n <BooleanField label=\"Active\" source=\"active\"/>\n </SimpleShowLayout>\n </Show>\n);\n","import * as React from 'react';\nimport {Link, withRouter} from 'react-router-dom';\nimport {connect, useSelector} from 'react-redux';\nimport {MenuItemLink} from 'react-admin';\nimport {logOutUser} from '../store/actions';\nimport {checkAuthentication} from '../utils/authFunctions';\nimport {assembleDefaultQueryString} from '../utils/dataFunctions';\nimport Emitter from '../utils/eventEmitter';\nimport Logo from '../assets/Parrot-Media-Logo-light.png';\nimport {useMediaQuery} from '@material-ui/core';\nimport {makeStyles} from '@material-ui/core/styles';\nimport DashboardIcon from '@material-ui/icons/Home';\nimport OrdersIcon from '@material-ui/icons/Receipt';\nimport {ContactIcon} from '../routes/Contact';\nimport {ProductIcon} from '../routes/Product';\nimport {ShowIcon} from '../routes/Show';\nimport Button from '@material-ui/core/Button';\nimport IconButton from '@material-ui/core/IconButton';\nimport PersonIcon from '@material-ui/icons/Person';\n\nconst useMenuStyles = makeStyles({\n root: {\n fontSize: '1.25em',\n },\n icon: {\n minWidth: 42,\n '& > svg': {\n fontSize: '1.75em'\n }\n }\n});\n\nconst inactiveStyle = {\n color: 'rgba(0, 0, 0, 0.54)'\n};\n\nconst useButtonStyles = makeStyles({\n root: {\n margin: '4px 0 6px 18px',\n }\n});\n\nconst useIconButtonStyles = makeStyles({\n root: {\n margin: '4px 0 6px 6px',\n }\n});\n\nconst dividerStyles = {\n collapsed: {\n display: 'none'\n },\n open: {\n margin: '16px 12px 16px 16px',\n },\n};\n\n/**\n * Menu with Keycloak Authentication\n *\n * @param onMenuClick\n * @param location\n * @param logout\n * @param keycloakReady\n * @param keycloakAuthenticated\n * @param tokens\n * @return {*}\n * @constructor\n */\nconst ParrotMenu = ({onMenuClick, location, logout, keycloakAuthenticated, tokens}) => {\n\n const handleLogout = () => {\n Emitter.emit('logoutUser', true);\n };\n\n let isAuthenticated = checkAuthentication(tokens.token, keycloakAuthenticated);\n\n const isXSmall = useMediaQuery(theme => theme.breakpoints.down('xs'));\n const open = useSelector(state => state.admin.ui.sidebarOpen);\n const classes = useMenuStyles();\n const buttonClasses = useButtonStyles();\n const iconButtonClasses = useIconButtonStyles();\n const dividerClass = (open) ? dividerStyles.open : dividerStyles.collapsed;\n const logoLinkClass = (open) ? 'logo-link' : 'logo-link collapsed';\n let dashboardLinkStyle = (location && location.pathname === '/') ? {} : inactiveStyle;\n const defaultOrderQueryString = assembleDefaultQueryString('Order');\n\n return (\n <div className=\"sidebar-menu\">\n <Link to=\"/\" title=\"Dashboard\" className={logoLinkClass}>\n <img src={Logo} alt=\"Parrot Media\" className=\"logo\"/>\n </Link>\n\n {isAuthenticated &&\n <>\n <MenuItemLink\n to=\"/\"\n primaryText=\"Dashboard\"\n leftIcon={<DashboardIcon/>}\n onClick={onMenuClick}\n sidebarIsOpen={open}\n classes={classes}\n style={dashboardLinkStyle}\n />\n\n {/* Products */}\n <MenuItemLink\n to=\"/Product\"\n primaryText=\"Products\"\n leftIcon={<ProductIcon/>}\n onClick={onMenuClick}\n sidebarIsOpen={open}\n classes={classes}\n />\n\n {/* Orders */}\n <MenuItemLink\n to={`/Order${defaultOrderQueryString}`}\n primaryText=\"Orders\"\n leftIcon={<OrdersIcon/>}\n onClick={onMenuClick}\n sidebarIsOpen={open}\n classes={classes}\n />\n\n {/* Titles (Shows) */}\n <MenuItemLink\n to=\"/Show\"\n primaryText=\"Titles\"\n leftIcon={<ShowIcon/>}\n onClick={onMenuClick}\n sidebarIsOpen={open}\n classes={classes}\n />\n\n {/* Contacts */}\n <MenuItemLink\n to=\"/Contact\"\n primaryText=\"Contacts\"\n leftIcon={<ContactIcon/>}\n onClick={onMenuClick}\n sidebarIsOpen={open}\n classes={classes}\n />\n\n <hr style={dividerClass}/>\n\n {open && isAuthenticated &&\n <Button\n variant=\"outlined\"\n color=\"primary\"\n startIcon={<PersonIcon/>}\n onClick={(e) => handleLogout(e)}\n classes={buttonClasses}\n >\n Logout\n </Button>\n }\n {!open && isAuthenticated &&\n <IconButton\n color=\"primary\"\n onClick={(e) => handleLogout(e)}\n classes={iconButtonClasses}\n >\n <PersonIcon/>\n </IconButton>\n }\n </>\n }\n\n {isXSmall && logout}\n </div>\n );\n};\n\nconst mapStateToProps = (state) => {\n return {\n keycloakAuthenticated: state.keycloakState.keycloakAuthenticated,\n keycloakReady: state.keycloakState.keycloakReady,\n tokens: {\n token: state.tokens.token\n }\n };\n};\n\nexport default withRouter(\n connect(\n mapStateToProps,\n {logOutUser}\n )(ParrotMenu)\n);\n","export default \"data:image/png;base64,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\"","import React from 'react';\nimport {Notification} from 'react-admin';\nimport {makeStyles} from '@material-ui/core/styles';\n\nconst useNotificationStyles = makeStyles({\n warning: {\n backgroundColor: '#b4212d'\n }\n});\n\nconst ParrotNotification = props => {\n const classes = useNotificationStyles();\n return (\n <Notification {...props} autoHideDuration={5000} classes={classes}/>\n )\n};\n\nexport default ParrotNotification;\n","/**\n * Extract location elements from window\n *\n * @returns {{search, route: string, href: *, hash}}\n */\nexport const getLocationElements = () => {\n const href = window.location.href;\n const hash = window.location.hash;\n const route = hash.substr(1);\n return {\n hash: window.location.hash,\n href: href,\n route: route,\n search: window.location.search\n };\n};","import React, {useCallback, useEffect} from 'react';\nimport {\n useHistory,\n useLocation\n} from 'react-router-dom';\nimport {connect} from 'react-redux';\nimport {Layout} from 'react-admin';\nimport ParrotAppBar from './ParrotAppBar';\nimport ParrotSidebar from './Sidebar';\nimport ParrotMenu from './Menu';\nimport ParrotNotification from './Notification';\nimport {checkAuthentication} from '../utils/authFunctions';\nimport {hasSpace} from '../utils/dataFunctions';\nimport {getLocationElements} from '../utils/pageFunctions';\nimport PTheme from '../global/theme';\nimport {makeStyles} from '@material-ui/core/styles';\n\nconst useLayoutStyles = makeStyles({\n root: {\n backgroundColor: PTheme.palette.canvasColor\n },\n content: {\n paddingTop: 16,\n flexWrap: 'wrap'\n }\n});\n\nconst ParrotLayoutWithTheme = ({keycloakReady, keycloakAuthenticated, tokens, ...props}) => {\n\n let history = useHistory();\n let location = useLocation();\n const classes = useLayoutStyles();\n\n const isAuthenticated = checkAuthentication(tokens.token, keycloakAuthenticated);\n\n const pushHistory = useCallback((route) => {\n if (route && !hasSpace(route)) {\n history.push(route);\n }\n }, [history]);\n\n // Effect: Store destination for redirection after Keycloak login\n useEffect(\n () => {\n const windowLocation = getLocationElements();\n if (\n windowLocation.route.indexOf('state=') === -1\n ) {\n // Store destination route without search queries or Keycloak state\n localStorage.setItem('destination', windowLocation.route);\n }\n\n }, [location]\n );\n\n // Effect: Set location\n useEffect(\n () => {\n const storedDestination = localStorage.getItem('destination');\n if (keycloakReady && isAuthenticated) {\n // If a destination was stored upon Keycloak redirection, push it to history\n if (storedDestination && storedDestination !== (location.pathname + location.search)) {\n pushHistory(storedDestination);\n }\n }\n\n }, [keycloakReady, history, isAuthenticated, location, pushHistory]\n );\n\n return (\n <Layout\n {...props}\n appBar={ParrotAppBar}\n sidebar={ParrotSidebar}\n menu={ParrotMenu}\n notification={ParrotNotification}\n classes={classes}\n />\n )\n};\n\nconst mapStateToProps = (state) => {\n return {\n keycloakAuthenticated: state.keycloakState.keycloakAuthenticated,\n keycloakReady: state.keycloakState.keycloakReady,\n tokens: {\n token: state.tokens.token\n }\n };\n};\n\nexport default connect(\n mapStateToProps,\n {}\n)(ParrotLayoutWithTheme);\n","import React, {Fragment} from 'react';\nimport {stripWhiteSpace} from '../utils/dataFunctions';\n\nconst styles = {\n container: {lineHeight: 1.4},\n label: {fontStyle: 'italic'},\n name: {fontWeight: 600}\n};\n\n/**\n * A component for displaying Contact Details from a record\n *\n * @param record\n * @return {JSX.Element}\n * @constructor\n */\nconst ContactDetails = ({record}) => {\n if (!record || !record.ship_to) {\n return (\n <Fragment>\n </Fragment>\n );\n }\n\n const country = stripWhiteSpace(record.ship_to.country);\n const city = stripWhiteSpace(record.ship_to.city);\n const state = stripWhiteSpace(record.ship_to.state);\n const email = stripWhiteSpace(record.ship_to.email);\n const phone = stripWhiteSpace(record.ship_to.phone);\n\n return (\n <div style={styles.container}>\n <span style={styles.name}>{record.ship_to.name}</span><br/>\n {record.ship_to.first_name} {record.ship_to.last_name}<br/>\n {record.ship_to.address}<br/>\n {record.ship_to.address2}<br/>\n {city}\n {state && state !== '' &&\n <Fragment>\n , {state}\n </Fragment>\n } {record.ship_to.zip}\n <br/>\n {country && country !== '' &&\n <Fragment>\n {country}\n <br/>\n </Fragment>\n }\n {email && email !== '' &&\n <Fragment>\n <span style={styles.label}>Email</span>: {email}<br/>\n </Fragment>\n }\n {phone && phone &&\n <Fragment>\n <span style={styles.label}>Phone</span>: {phone}\n </Fragment>\n }\n </div>\n );\n}\n\nexport default ContactDetails;\n","import React, {useEffect, useState} from 'react';\nimport axios from 'axios';\nimport {RESOURCES as resources} from '../orderResources';\nimport {postItem} from '../utils/apiOrderFunctions';\nimport {getGetHeaders} from '../utils/headers';\nimport ListLoading from './ListLoading';\nimport OrderItemsList from './OrderItemsList';\n\n/**\n * A component for retrieving and displaying a Product List by Order ID\n *\n * @param orderId\n * @param hasEditQty\n * @param props\n * @return {JSX.Element}\n * @constructor\n */\nconst OrderItemListViewContainer = ({\n orderId,\n hasEditQty = true,\n ...props\n }) => {\n\n const [itemList, setItemList] = useState({\n products: []\n });\n const [loading, setLoading] = useState(false);\n const [saving, setSaving] = useState(false);\n const [saveError, setSaveError] = useState(null);\n const [updateComplete, setUpdateComplete] = useState(false);\n\n // Effect: Fetch Products by Order ID\n useEffect(\n () => {\n let id = orderId;\n if (!id) {\n id = (props.id) ? props.id : null;\n }\n if (id && !updateComplete) {\n const fetchItems = () => {\n const params = {\n active: true,\n id: id,\n params: {\n filter: {},\n pagination: {page: 1, perPage: 10000},\n sort: {field: \"title\", order: \"ASC\"}\n }\n };\n\n const cfg = resources.OrderItem.GET_LIST(params);\n axios({\n method: 'GET',\n url: cfg.uri,\n headers: getGetHeaders(),\n maxBodyLength: Infinity,\n maxContentLength: Infinity\n }).then((response) => {\n if (response.data && response.data.length > 0) {\n setItemList(itemList => ({...itemList, products: response.data}));\n setUpdateComplete(true);\n }\n setLoading(false);\n // resolve(response);\n }).catch((error) => {\n console.log('error response for Products: ', error);\n if (error.response) {\n // Server response outside 2xx\n } else if (error.request) {\n // No response\n }\n setLoading(false);\n });\n };\n\n // If an Order ID becomes available or has changed, or if a refresh is needed, fetch Products\n if ((orderId || props.id) || !updateComplete) {\n setLoading(true);\n fetchItems();\n }\n }\n\n }, [orderId, props.id, updateComplete]\n );\n\n const handleUpdateQty = (e) => {\n const item = (e && e.item) ? e.item : null;\n const newQty = (e && e.new_qty) ? e.new_qty : null;\n let id = (props.id) ? parseInt(props.id, 10) : null;\n if (item && newQty && id) {\n // Post the update for the requested Product\n setSaving(true);\n const params = {\n id: item.id,\n order_id: id,\n product_id: item.product_id,\n qty: item.qty,\n new_qty: newQty\n };\n postItem('updateItem', params)\n .then(result => {\n if (result && result.product_id) {\n // Display message and reset item list\n setSaving(false);\n setSaveError(null);\n setUpdateComplete(false);\n }\n })\n .catch(error => {\n console.log('Product Update Error: ', error);\n // Display message\n setSaving(false);\n setSaveError('Sorry, there was an error updating this Item.');\n });\n }\n };\n\n return (\n <>\n {loading &&\n <ListLoading text=\"Loading Products...\"/>\n }\n <OrderItemsList\n itemList={itemList.products}\n hasEditQty={hasEditQty}\n hasRemove={false}\n saving={saving}\n error={saveError}\n onEditQtyFunc={(e) => handleUpdateQty(e)}\n />\n </>\n );\n}\n\nexport default OrderItemListViewContainer;\n","export const ORDER_STATUS = [\n {id: 1, name: 'Pending'},\n {id: 2, name: 'In Progress'},\n {id: 7, name: 'In Production'},\n {id: 6, name: 'Ready to Ship'},\n {id: 4, name: 'Shipped'},\n {id: 5, name: 'Archived'}\n];\n\nexport const ORDER_STATUS_NO_CANCEL = [\n {id: 1, name: 'Pending'},\n {id: 2, name: 'In Progress'},\n {id: 7, name: 'In Production'},\n {id: 6, name: 'Ready to Ship'},\n {id: 4, name: 'Shipped'},\n {id: 5, name: 'Archived'}\n];\n","import React, {cloneElement} from 'react';\nimport {\n List,\n Filter,\n SimpleList,\n SimpleShowLayout,\n TopToolbar,\n DateField,\n TextField,\n DateInput,\n SelectInput,\n TextInput,\n CreateButton,\n sanitizeListRestProps,\n useListContext,\n useListController,\n useShowController\n} from 'react-admin';\nimport Show from '../components/admin/Show';\nimport DataTable from '../components/admin/DataTable';\nimport ContactDetails from '../components/ContactDetails';\nimport FieldDescription from '../components/FieldDescription';\nimport FieldDivider from '../components/FieldDivider';\nimport OrderItemListViewContainer from '../components/OrderItemListViewContainer';\nimport SelectFromListInput from '../components/SelectFromListInput';\nimport {getDefaultDateRanges} from '../utils/dataFunctions';\nimport {showButtonColumnObject} from '../utils/tableFunctions';\nimport {ORDER_QUERY_DEFAULTS, ORDER_RECEIPT_TABLE_FILTERS} from '../global/orderReceiptDefaults';\nimport {ORDER_STATUS} from '../global/orderStatus';\nimport {viewStyles} from '../global/styles';\nimport {useMediaQuery} from '@material-ui/core';\nimport Avatar from '@material-ui/core/Avatar';\nimport OrdersIcon from '@material-ui/icons/Receipt';\n\nexport const OrderIcon = OrdersIcon;\n\nconst defaultDateRanges = getDefaultDateRanges();\n\n/**\n * View: List\n */\n\nconst ListFilter = (props) => {\n\n const onFilterChange = (e) => {\n // Clear table quick-filters when top-level Filters change\n let updateFilters = false;\n let fName, fValue;\n if (e && e.target) {\n fName = e.target.name;\n fValue = e.target.value;\n }\n // If View Mode or Filter By changes:\n if (\n fName && fValue &&\n (fName === 'filter_list_view' || fName === 'filter_by')\n ) {\n const fValues = JSON.parse(JSON.stringify(props.filterValues));\n ORDER_RECEIPT_TABLE_FILTERS.forEach((filter) => {\n if (fValues[filter.key]) {\n if (filter.clearOnFilterBy.includes(fValue) || fName === 'filter_list_view') {\n fValues[filter.key] = undefined;\n updateFilters = true;\n }\n }\n });\n if (updateFilters && typeof props.setFilters === 'function') {\n fValues[fName] = fValue;\n props.setFilters(fValues);\n }\n }\n };\n\n return (\n <Filter {...props}>\n <SelectInput\n key=\"filter_by\" source=\"filter_by\" label=\"Filter By:\"\n choices={[\n {id: 'date_range', name: 'Date Range'},\n {id: 'client', name: 'Client'},\n {id: 'contact', name: 'Client Contact'},\n {id: 'id', name: 'Order ID'},\n {id: 'sku', name: 'Product SKU'},\n {id: 'status', name: 'Status'}\n ]}\n alwaysOn\n allowEmpty={true}\n onChange={(e) => onFilterChange(e)}\n className=\"input-150\"\n />\n <SelectFromListInput\n inAdminForm={true}\n source=\"filter_org_id\"\n resourceName=\"Organization\"\n listLabel={(props.filterValues.filter_by === 'contact') ? 'Select Client' : 'By Client'}\n itemPlural=\"Clients\"\n returnType=\"string\"\n listFilters={{\n active: true\n }}\n isRequired={false}\n alwaysOn\n size=\"small\"\n hasClear={false}\n onChange={(e) => onFilterChange(e)}\n className={(props.filterValues.filter_by && (props.filterValues.filter_by === 'client' || props.filterValues.filter_by === 'contact')) ? 'input-select-list' : 'input-hidden'}\n />\n <SelectFromListInput\n inAdminForm={true}\n source=\"filter_contact_id\"\n resourceName=\"Contact\"\n listLabel=\"Select Contact\"\n itemPlural=\"Contacts\"\n returnType=\"string\"\n listFilters={{\n active: true,\n params: {\n filter: {\n filter_org_id: props.filterValues.filter_org_id\n },\n }\n }}\n isRequired={false}\n alwaysOn\n size=\"small\"\n hasClear={false}\n onChange={(e) => onFilterChange(e)}\n className={(props.filterValues.filter_by && props.filterValues.filter_by === 'contact') ? 'input-select-list' : 'input-hidden'}\n />\n <SelectInput\n key=\"filter_status_id\"\n source=\"filter_status_id\"\n label=\"By Status\"\n choices={ORDER_STATUS}\n alwaysOn\n allowEmpty={false}\n onChange={(e) => onFilterChange(e)}\n className={(props.filterValues.filter_by && props.filterValues.filter_by === 'status') ? 'input-120' : 'input-hidden'}\n />\n <TextInput\n key=\"filter_id\"\n label=\"Enter Order ID\"\n source=\"filter_id\"\n placeholder=\"\"\n alwaysOn\n onChange={(e) => onFilterChange(e)}\n className={(props.filterValues.filter_by && props.filterValues.filter_by === 'id') ? 'input-180' : 'input-hidden'}\n />\n <TextInput\n key=\"filter_sku\"\n label=\"Enter full Product SKU\"\n source=\"filter_sku\"\n placeholder=\"SKU-N00012345\"\n alwaysOn\n onChange={(e) => onFilterChange(e)}\n className={(props.filterValues.filter_by && props.filterValues.filter_by === 'sku') ? 'input-180' : 'input-hidden'}\n />\n <DateInput\n key=\"filter_from\"\n source=\"filter_from\" label=\"From\"\n inputProps={{\n min: defaultDateRanges.from,\n max: defaultDateRanges.to\n }}\n alwaysOn\n onChange={(e) => onFilterChange(e)}\n className={\n (\n (props.filterValues.filter_by && props.filterValues.filter_by === 'date_range') ||\n (props.filterValues.filter_by && props.filterValues.filter_by === 'client' && props.filterValues.filter_org_id) ||\n (props.filterValues.filter_by && props.filterValues.filter_by === 'contact' && props.filterValues.filter_contact_id) ||\n (props.filterValues.filter_by && props.filterValues.filter_by === 'status' && props.filterValues.filter_status_id)\n )\n ? 'input-180' : 'input-hidden'\n }\n />\n <DateInput\n key=\"filter_to\"\n source=\"filter_to\" label=\"To\"\n inputProps={{\n min: defaultDateRanges.from,\n max: defaultDateRanges.to\n }}\n alwaysOn\n onChange={(e) => onFilterChange(e)}\n className={\n (\n (props.filterValues.filter_by && props.filterValues.filter_by === 'date_range') ||\n (props.filterValues.filter_by && props.filterValues.filter_by === 'client' && props.filterValues.filter_org_id) ||\n (props.filterValues.filter_by && props.filterValues.filter_by === 'contact' && props.filterValues.filter_contact_id) ||\n (props.filterValues.filter_by && props.filterValues.filter_by === 'status' && props.filterValues.filter_status_id)\n )\n ? 'input-180' : 'input-hidden'\n }\n />\n </Filter>\n )\n};\n\nconst ListTitle = <span><Avatar style={viewStyles.avatar} className=\"avatar-title\"\n alt=\"Orders\"><OrderIcon style={viewStyles.avatarSvg}/></Avatar>Orders</span>;\n\nconst ListActions = (props) => {\n const {\n className,\n filters,\n ...rest\n } = props;\n const {\n resource,\n displayedFilters,\n filterValues,\n basePath,\n showFilter\n } = useListContext();\n return (\n <TopToolbar className={className} {...sanitizeListRestProps(rest)}>\n {filters && cloneElement(filters, {\n resource,\n showFilter,\n displayedFilters,\n filterValues,\n context: 'button',\n })}\n <CreateButton basePath={basePath}/>\n </TopToolbar>\n );\n};\n\nconst showButtonColumn = showButtonColumnObject();\n\nconst listSort = {field: ORDER_QUERY_DEFAULTS.sort_by, order: ORDER_QUERY_DEFAULTS.sort_order};\nconst listPagination = {page: ORDER_QUERY_DEFAULTS.page, perPage: ORDER_QUERY_DEFAULTS.per_page};\n\nexport const OrderList = (props) => {\n const isSmall = useMediaQuery(theme => theme.breakpoints.down('sm'));\n const lc = useListController(props);\n const fv = lc.filterValues;\n const filterDefaultValues = {\n filter_by: 'status',\n filter_status_id: 1,\n filter_from: defaultDateRanges.monthBack,\n filter_to: defaultDateRanges.to\n };\n\n // Assemble List columns based on selected Filter By values\n const clientCol = {\n Header: 'Client',\n accessor: 'org_name',\n sortType: 'basic',\n sortBy: 'org_id',\n Cell: ({row}) => <span\n style={viewStyles.noWrap}>{(row.original.org_name) ? row.original.org_name : ''}</span>\n };\n const destinationCol = {\n Header: 'Destination',\n accessor: 'ship_to_name',\n sortType: 'basic',\n sortBy: 'ship_to_id',\n Cell: ({row}) =>\n <span>{(row.original.ship_to && row.original.ship_to_name) ? row.original.ship_to_name : ''}</span>\n };\n const statusCol = {\n Header: 'Status',\n accessor: 'order_status',\n sortType: 'basic',\n sortBy: 'status_id',\n Cell: ({row}) => <span>{(row.original.order_status) ? row.original.order_status : ''}</span>\n };\n\n // Create initial columns\n const listColumns = [\n {\n Header: 'Order ID',\n accessor: 'id',\n sortType: 'basic',\n width: 90,\n maxWidth: 90,\n },\n {\n Header: 'Created On',\n accessor: 'created_on',\n sortType: 'datetime',\n disableFilters: true,\n Cell: ({row}) => <span>{(row.original.created_on_string) ? row.original.created_on_string : ''}</span>\n }\n ];\n\n // Exclude columns based on Filter By (Client, Contact)\n if (fv?.filter_by) {\n if (\n (!fv.filter_org_id) ||\n (fv.filter_by !== 'client' && fv.filter_by !== 'contact')\n ) {\n listColumns.push(clientCol);\n }\n } else {\n // If Filter By is unselected, display columns\n listColumns.push(clientCol);\n }\n\n // Exclude columns based on Filter By (Contact, Status)\n if (fv?.filter_by) {\n if (!fv.filter_contact_id || fv.filter_by !== 'contact') {\n listColumns.push(destinationCol);\n }\n if (!fv.filter_status_id || fv.filter_by !== 'status') {\n listColumns.push(statusCol);\n }\n } else {\n // If Filter By is unselected, display columns\n listColumns.push(destinationCol, statusCol);\n }\n\n listColumns.push(\n {\n Header: 'Created By',\n accessor: 'created_by',\n sortType: 'basic',\n Cell: ({row}) => <span>{(row.original.created_by) ? row.original.created_by : ''}</span>\n },\n showButtonColumn\n );\n\n return (\n <List\n title={ListTitle}\n sort={listSort}\n perPage={listPagination.perPage}\n actions={<ListActions/>}\n filters={<ListFilter setFilters={lc.setFilters}/>}\n filterDefaultValues={filterDefaultValues}\n bulkActionButtons={false}\n pagination={false}\n {...props}\n >\n {isSmall ? (\n <SimpleList\n primaryText={record => record.org_name}\n secondaryText={record => record.ship_to_name}\n tertiaryText={record => record.id}\n />\n ) : (\n <DataTable\n columns={listColumns}\n sort={listSort}\n listFilters=\"filterValues\"\n listFilter=\"filter_by\"\n messageFilter=\"Select a Filter to view Orders.\"\n messageEmpty=\" No Orders found. Please select a filter to view Orders.\"\n storeForExport={false}\n manualQuickFilters={true}\n manualSortAndPagination={true}\n {...props}\n />\n )}\n </List>\n )\n};\n\n/**\n * View: Show\n */\n\nconst ShowTitle = ({record}) => {\n return <span><Avatar style={viewStyles.avatar} className=\"avatar-title\" alt=\"Orders\"><OrderIcon\n style={viewStyles.avatarSvg}/></Avatar>{record ? `Order #${record.id}` : 'Order'}</span>;\n};\n\nexport const OrderShow = (props) => {\n const controllerProps = useShowController(props);\n\n return (\n <Show title={<ShowTitle/>} {...props} {...controllerProps}>\n <SimpleShowLayout className=\"show-layout\">\n <FieldDescription\n text=\"Review Order details below. To update this Order, please contact Parrot Media.\"\n instructions={true} marginBottom={true}\n />\n <TextField label=\"Order ID\" source=\"id\" className=\"input-inline input-900\"/>\n <TextField label=\"Client\" source=\"org_name\" className=\"input-inline input-320\"/>\n <TextField label=\"Order Status\" source=\"order_status\" className=\"input-inline input-120\"/>\n\n <FieldDivider type=\"divider\"/>\n <FieldDescription text=\"Order Details\" instructions={true} marginBottom={true}/>\n <TextField label=\"Created By\" source=\"created_by\" className=\"input-inline input-220\"/>\n <DateField label=\"Created On\" source=\"created_on\" className=\"input-inline input-220\"/>\n <FieldDivider type=\"break\"/>\n <TextField label=\"Carrier\" source=\"shipped_with_name\" className=\"input-inline input-220\"/>\n <TextField label=\"Method\" source=\"shipping_type_name\" className=\"input-inline input-220\"/>\n <FieldDivider type=\"break\"/>\n <TextField label=\"Tracking Number\" source=\"tracking_number\" className=\"field-bg\"/>\n <TextField label=\"Notes\" source=\"client_notes\" className=\"field-bg has-breaks\"/>\n\n <FieldDivider type=\"divider\"/>\n <FieldDescription text=\"Products in Order\" instructions={true} marginBottom={true}/>\n <OrderItemListViewContainer hasEditQty={false} {...props}/>\n\n <FieldDivider type=\"divider\"/>\n <FieldDescription text=\"Shipping Details\" instructions={true} marginBottom={true}/>\n <ContactDetails record={controllerProps.record}/>\n </SimpleShowLayout>\n </Show>\n )\n};\n","import * as React from \"react\";\nimport {\n SimpleShowLayout,\n BooleanField,\n TextField\n} from 'react-admin';\nimport Show from '../components/admin/Show';\nimport FieldDescription from '../components/FieldDescription';\nimport {viewStyles} from '../global/styles';\nimport Avatar from '@material-ui/core/Avatar';\nimport BusinessIcon from '@material-ui/icons/Business';\n\nexport const OrganizationIcon = BusinessIcon;\n\n/**\n * View: Show\n */\n\nconst ShowTitle = ({record}) => {\n return <span><Avatar style={viewStyles.avatar} className=\"avatar-title\"\n alt=\"Clients\"><OrganizationIcon\n style={viewStyles.avatarSvg}/></Avatar>{record ? `${record.name}` : 'Client'}</span>;\n};\n\nexport const OrganizationShow = (props) => (\n <Show title={<ShowTitle/>} {...props}>\n <SimpleShowLayout className=\"show-layout\">\n <FieldDescription\n instructions={true} marginBottom={true}\n text={`\n Review Client details below. To edit this Client, click Edit above.\n `}\n />\n <TextField label=\"ID\" source=\"id\" className=\"input-inline input-120\"/>\n <TextField label=\"Group Name\" source=\"machine_name\" className=\"input-inline input-280\"/>\n <TextField label=\"Name of Client\" source=\"name\" className=\"field-bg\"/>\n <TextField label=\"Email Address\" source=\"email\" className=\"field-bg\"/>\n <TextField label=\"Phone\" source=\"phone\" className=\"field-bg\"/>\n <TextField label=\"Address\" source=\"address\" className=\"field-bg\"/>\n <TextField label=\"City\" source=\"city\" className=\"input-inline input-180\"/>\n <TextField label=\"State\" source=\"state\" className=\"input-inline input-120\"/>\n <TextField label=\"Zip\" source=\"zip\" className=\"input-inline input-120\"/>\n <BooleanField label=\"Active\" source=\"active\"/>\n </SimpleShowLayout>\n </Show>\n);","import * as React from \"react\";\nimport Card from '@material-ui/core/Card';\nimport CardContent from '@material-ui/core/CardContent';\nimport {Title} from 'react-admin';\n\nconst NotFound = () => (\n <Card>\n <Title title=\"Not Found\"/>\n <CardContent>\n <h1>404: Page not found</h1>\n </CardContent>\n </Card>\n);\n\nexport default NotFound;","import React from 'react';\nimport {Admin, Resource} from 'react-admin';\nimport {Provider} from 'react-redux';\nimport axios from 'axios';\nimport {history} from \"./utils/history\";\nimport polyglotI18nProvider from 'ra-i18n-polyglot';\nimport Emitter from './utils/eventEmitter';\nimport createPortalStore from './store/store';\nimport {processKeycloakTokens} from './utils/tokenFunctions';\nimport authProvider from './authProvider';\nimport dataProvider from './dataProvider';\nimport customRoutes from './routes';\nimport englishMessages from './language/en';\nimport KeycloakHandler from './utils/KeycloakHandler';\nimport ParrotLayout from './components/Layout';\n\nimport {\n ContactList,\n ContactShow,\n ContactCreate,\n ContactEdit,\n ContactIcon\n} from './routes/Contact';\nimport {\n OrderList,\n OrderShow,\n OrderIcon\n} from './routes/Order';\nimport {\n OrganizationShow,\n OrganizationIcon\n} from './routes/Organization';\nimport {\n ProductList,\n ProductShow,\n ProductIcon\n} from './routes/Product';\nimport {\n ShowList,\n ShowShow,\n ShowIcon\n} from './routes/Show';\nimport Dashboard from './routes/Dashboard';\nimport LoginPage from './routes/Login';\nimport NotFound from './routes/NotFound';\n\nimport PTheme from './global/theme';\nimport {createTheme} from '@material-ui/core/styles';\n\nconst i18nProvider = polyglotI18nProvider(() => englishMessages, 'en', {allowMissing: true});\nconst theme = createTheme(PTheme);\n\n/**\n * Initialize Keycloak\n *\n * @param keycloak\n * @param config\n * @returns {Promise<void>}\n */\nconst initKeycloak = async (keycloak, config) => {\n try {\n await keycloak.init(config).then(function (result) {\n if (keycloak.didInitialize) {\n Emitter.emit('keycloakReady', true);\n }\n Emitter.emit('keycloakAuthenticated', keycloak.authenticated);\n if (keycloak.authenticated === false) {\n Emitter.emit('loginKeycloak', window.origin);\n } else {\n processKeycloakTokens(keycloak.token, keycloak.idToken, keycloak.refreshToken);\n }\n }).catch(function (e) {\n console.log('Keycloak initialization error: ', e);\n });\n } catch (error) {\n console.log('Error: Authentication failed: ', error);\n }\n};\n\n/**\n * Set listeners for the Keycloak instance\n *\n * @param keycloak\n */\nconst setKeycloakEventHandlers = (keycloak) => {\n keycloak.onAuthLogout = () => {\n processKeycloakTokens(null, null, null);\n };\n keycloak.onAuthRefreshSuccess = () => {\n processKeycloakTokens(keycloak.token, keycloak.idToken, keycloak.refreshToken);\n // Set Authorization header for all Axios calls\n axios.defaults.headers.common['Authorization'] = `Bearer ${keycloak.token}`;\n };\n keycloak.onAuthSuccess = () => {\n processKeycloakTokens(keycloak.token, keycloak.idToken, keycloak.refreshToken);\n // Set Authorization header for all Axios calls\n axios.defaults.headers.common['Authorization'] = `Bearer ${keycloak.token}`;\n };\n keycloak.onReady = () => {\n };\n keycloak.onTokenExpired = () => {\n processKeycloakTokens(null, null, null);\n };\n};\n\nconst App = ({\n configParams,\n keycloak,\n keycloakInitConfig\n }) => {\n\n const dp = Object.assign(dataProvider);\n const store = createPortalStore({authProvider, dp, history});\n initKeycloak(keycloak, keycloakInitConfig).then(() => {\n setKeycloakEventHandlers(keycloak);\n });\n\n return (\n <Provider\n store={store}\n >\n <>\n <Admin\n theme={theme}\n authProvider={authProvider}\n configParams={configParams}\n dataProvider={dp}\n history={history}\n i18nProvider={i18nProvider}\n title=\"Parrot Media Portal\"\n layout={ParrotLayout}\n dashboard={Dashboard}\n customRoutes={customRoutes}\n loginPage={LoginPage}\n catchAll={NotFound}\n disableTelemetry\n >\n <Resource\n name=\"Contact\" icon={ContactIcon}\n list={ContactList} show={ContactShow}\n create={ContactCreate} edit={ContactEdit}\n options={{label: 'Contacts'}}\n />\n <Resource\n name=\"Order\" icon={OrderIcon}\n list={OrderList} show={OrderShow}\n options={{label: 'Orders'}}\n />\n <Resource\n name=\"Organization\" icon={OrganizationIcon}\n show={OrganizationShow}\n options={{label: 'Clients'}}\n />\n <Resource\n name=\"Product\" icon={ProductIcon}\n list={ProductList} show={ProductShow}\n options={{label: 'Products'}}\n />\n <Resource\n name=\"Show\" icon={ShowIcon}\n list={ShowList} show={ShowShow}\n options={{label: 'Titles'}}\n />\n <Resource name=\"ClientUserOrg\"/>\n <Resource name=\"Org\"/>\n <Resource name=\"OrdersByStatus\"/>\n <Resource name=\"Products\"/>\n <Resource name=\"ProductsByOrg\"/>\n <Resource name=\"ProductsByShow\"/>\n <Resource name=\"ProductsByTitle\"/>\n <Resource name=\"ProductsByType\"/>\n <Resource name=\"ProductType\"/>\n <Resource name=\"ShippingCompany\"/>\n <Resource name=\"ShippingMethod\"/>\n </Admin>\n <KeycloakHandler keycloak={keycloak}/>\n </>\n </Provider>\n );\n};\n\nexport default App;\n","import {isLocalhost} from './utils/dataFunctions';\n\nexport function register(config) {\n if (process.env.NODE_ENV === 'production' && 'serviceWorker' in navigator) {\n const publicUrl = new URL(process.env.PUBLIC_URL, window.location.href);\n if (publicUrl.origin !== window.location.origin) {\n return;\n }\n\n window.addEventListener('load', () => {\n const swUrl = `${process.env.PUBLIC_URL}/service-worker.js`;\n\n if (isLocalhost) {\n checkValidServiceWorker(swUrl, config);\n\n navigator.serviceWorker.ready.then(() => {\n console.log(\n 'This web app is being served cache-first by a service ' +\n 'worker. To learn more, visit https://bit.ly/CRA-PWA'\n );\n });\n } else {\n registerValidSW(swUrl, config);\n }\n });\n }\n}\n\nfunction registerValidSW(swUrl, config) {\n navigator.serviceWorker\n .register(swUrl)\n .then(registration => {\n registration.onupdatefound = () => {\n const installingWorker = registration.installing;\n if (installingWorker == null) {\n return;\n }\n installingWorker.onstatechange = () => {\n if (installingWorker.state === 'installed') {\n if (navigator.serviceWorker.controller) {\n console.log(\n 'New content is available and will be used when all ' +\n 'tabs for this page are closed. See https://bit.ly/CRA-PWA.'\n );\n\n if (config && config.onUpdate) {\n config.onUpdate(registration);\n }\n } else {\n console.log('Content is cached for offline use.');\n\n // Execute callback\n if (config && config.onSuccess) {\n config.onSuccess(registration);\n }\n }\n }\n };\n };\n })\n .catch(error => {\n console.error('Error during service worker registration:', error);\n });\n}\n\nfunction checkValidServiceWorker(swUrl, config) {\n fetch(swUrl, {\n headers: {'Service-Worker': 'script'},\n })\n .then(response => {\n const contentType = response.headers.get('content-type');\n if (\n response.status === 404 ||\n (contentType != null && contentType.indexOf('javascript') === -1)\n ) {\n navigator.serviceWorker.ready.then(registration => {\n registration.unregister().then(() => {\n window.location.reload();\n });\n });\n } else {\n registerValidSW(swUrl, config);\n }\n })\n .catch(() => {\n console.log(\n 'No internet connection found. App is running in offline mode.'\n );\n });\n}\n\nexport function unregister() {\n if ('serviceWorker' in navigator) {\n navigator.serviceWorker.ready\n .then(registration => {\n registration.unregister();\n })\n .catch(error => {\n console.error(error.message);\n });\n }\n}\n","import React from 'react';\nimport ReactDOM from 'react-dom';\nimport Keycloak from 'keycloak-js';\nimport {getEnvironmentConfig} from './utils/dataFunctions';\nimport App from './App';\nimport './css/index.css';\nimport * as serviceWorker from './serviceWorker';\n\nlet configParams = {\n api_url: '',\n auth_client_id: '',\n auth_realm: '',\n auth_url: ''\n};\n\n// Load values from public configuration file\nlet envConfigRequest = getEnvironmentConfig();\n\nenvConfigRequest\n .then(data => {\n if (data) {\n\n // Set values\n configParams.api_url = data.api_url;\n configParams.auth_client_id = data.auth_client_id;\n configParams.auth_realm = data.auth_realm;\n configParams.auth_url = data.auth_url;\n\n // Store values to use for API calls\n localStorage.removeItem('server');\n localStorage.setItem('server', configParams.api_url);\n\n // Create new Keycloak instance with parameters\n const keycloak = new Keycloak({\n realm: configParams.auth_realm,\n clientId: configParams.auth_client_id,\n url: configParams.auth_url,\n // silentCheckSsoRedirectUri: process.env.PUBLIC_URL + '/silent-check-sso.html',\n enableLogging: true\n });\n\n const keycloakInitConfig = {\n onLoad: 'check-sso',\n promiseType: 'native',\n checkLoginIframe: true\n };\n\n // Render the application\n ReactDOM.render(\n <App\n keycloak={keycloak}\n keycloakInitConfig={keycloakInitConfig}\n configParams={configParams}\n />,\n document.getElementById('admin')\n );\n\n // Set server items\n serviceWorker.unregister();\n\n } else {\n return Promise.reject('Failed to load Server Configuration');\n }\n }).catch(error => {\n console.log('Server Configuration Error: ', error);\n return Promise.reject('Failed to load Server Configuration');\n }\n);\n\nserviceWorker.unregister();\n"],"sourceRoot":""}