Skip to content

Commit

Permalink
Merge pull request #130 from performant-software/feature/rc129_custom…
Browse files Browse the repository at this point in the history
…ize_axios

RC #129 - Customize Axios
  • Loading branch information
dleadbetter authored May 17, 2022
2 parents 4deea83 + 86a85fd commit 7593975
Show file tree
Hide file tree
Showing 24 changed files with 463 additions and 18 deletions.
4 changes: 3 additions & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,9 @@
"packages/*"
],
"scripts": {
"build-storybook": "yarn --cwd packages/storybook build",
"build-semantic": "yarn --cwd packages/semantic-ui build",
"build-shared": "yarn --cwd packages/shared build",
"build-storybook": "yarn build-shared && yarn build-semantic && yarn --cwd packages/storybook build",
"flow": "flow",
"storybook": "yarn --cwd packages/storybook storybook",
"test": "jest"
Expand Down
6 changes: 3 additions & 3 deletions packages/semantic-ui/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@performant-software/semantic-components",
"version": "0.5.2",
"version": "0.5.3",
"description": "A package of shared components based on the Semantic UI Framework.",
"license": "MIT",
"main": "./build/index.js",
Expand All @@ -9,7 +9,7 @@
"build": "webpack --mode production && flow-copy-source -v src types"
},
"dependencies": {
"@performant-software/shared-components": "^0.5.2",
"@performant-software/shared-components": "^0.5.3",
"@react-google-maps/api": "^2.8.1",
"axios": "^0.26.1",
"flow-copy-source": "^2.0.9",
Expand All @@ -30,7 +30,7 @@
"react-dom": ">= 16.13.1 < 18.0.0"
},
"devDependencies": {
"@performant-software/webpack-config": "^0.5.2",
"@performant-software/webpack-config": "^0.5.3",
"react": "^17.0.2",
"react-dom": "^17.0.2"
}
Expand Down
Empty file.
118 changes: 118 additions & 0 deletions packages/semantic-ui/src/components/ReferenceCodeDropdown.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,118 @@
// @flow

import { ReferenceCodesService } from '@performant-software/shared-components';
import React, {
useCallback,
useEffect,
useMemo,
useState
} from 'react';
import _ from 'underscore';
import { Dropdown } from 'semantic-ui-react';

type Item = {
reference_table_id: number,
key: string
};

type Props = {
fluid?: boolean,
multiple?: boolean,
onChange: (item: Item) => void,
placeholder?: string,
referenceTable: string,
value: Item | Array<Item>
};

const ReferenceCodeDropdown = (props: Props) => {
const [loading, setLoading] = useState(false);
const [options, setOptions] = useState([]);

/**
* Converts the passed ID to a reference code item.
*
* @type {function(*): {reference_code_id: *}}
*/
const toItem = useCallback((id) => ({
reference_code_id: id
}), []);

/**
* Converts the passed reference code to a dropdown option.
*
* @type {function(*): {text: *, value: *, key: *}}
*/
const toOption = useCallback((referenceCode) => ({
key: referenceCode.id,
value: referenceCode.id,
text: referenceCode.name
}), []);

/**
* Converts the selected values and calls the onChange prop.
*
* @type {(function(*, {value: *}): void)|*}
*/
const onChange = useCallback((e, { value }) => {
let values;

if (props.multiple) {
values = value;
} else {
values = _.compact([value]);
}

props.onChange(_.map(values, toItem));
}, [toItem, props.multiple, props.onChange]);

/**
* Sets the "value" variable for the Dropdown component.
*/
const value = useMemo(() => {
const v = _.pluck(_.filter(props.value, (x) => !x._destroy), 'reference_code_id');
return props.multiple ? v : _.first(v);
}, [props.multiple, props.value]);

/**
* Loads the list of reference codes from the server.
*/
useEffect(() => {
setLoading(true);

const params = {
per_page: 0,
reference_table: props.referenceTable,
sort_by: 'name'
};

ReferenceCodesService
.fetchAll(params)
.then(({ data }) => setOptions(_.map(data.reference_codes, toOption)))
.finally(() => setLoading(false));
}, [toOption]);

return (
<Dropdown
clearable
disabled={loading}
fluid={props.fluid}
loading={loading}
multiple={props.multiple}
onChange={onChange}
options={options}
placeholder={props.placeholder}
search
selection
selectOnBlur={false}
value={value}
/>
);
};

ReferenceCodeDropdown.defaultProps = {
fluid: true,
multiple: false,
placeholder: undefined
};

export default ReferenceCodeDropdown;
Empty file.
32 changes: 32 additions & 0 deletions packages/semantic-ui/src/components/ReferenceCodeModal.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
// @flow

import type { EditContainerProps } from '@performant-software/shared-components';
import React from 'react';
import { Form, Modal } from 'semantic-ui-react';
import i18n from '../i18n/i18n';

const ReferenceCodeModal = (props: EditContainerProps) => (
<Modal
as={Form}
centered={false}
open
>
<Modal.Header
content={props.item.id
? i18n.t('ReferenceCodeModal.title.edit')
: i18n.t('ReferenceCodeModal.title.add')}
/>
<Modal.Content>
<Form.Input
error={props.isError('name')}
label={i18n.t('ReferenceCodeModal.labels.name')}
onChange={props.onTextInputChange.bind(this, 'name')}
required={props.isRequired('name')}
value={props.item.name}
/>
</Modal.Content>
{ props.children }
</Modal>
);

export default ReferenceCodeModal;
Empty file.
67 changes: 67 additions & 0 deletions packages/semantic-ui/src/components/ReferenceTableModal.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
// @flow

import type { EditContainerProps } from '@performant-software/shared-components';
import React from 'react';
import { Form, Header, Modal } from 'semantic-ui-react';
import EmbeddedList from './EmbeddedList';
import ReferenceCodeModal from './ReferenceCodeModal';
import i18n from '../i18n/i18n';

const ReferenceTableModal = (props: EditContainerProps) => (
<Modal
as={Form}
centered={false}
className='reference-table-modal'
open
>
<Modal.Header
content={props.item.id
? i18n.t('ReferenceTableModal.title.edit')
: i18n.t('ReferenceTableModal.title.add')}
/>
<Modal.Content>
<Form.Input
error={props.isError('name')}
label={i18n.t('ReferenceTableModal.labels.name')}
onChange={props.onTextInputChange.bind(this, 'name')}
required={props.isRequired('name')}
value={props.item.name}
/>
<Form.Input
error={props.isError('key')}
label={i18n.t('ReferenceTableModal.labels.key')}
onChange={props.onTextInputChange.bind(this, 'key')}
required={props.isRequired('key')}
value={props.item.key}
/>
<Header
content={i18n.t('ReferenceTableModal.labels.referenceCodes')}
/>
<EmbeddedList
actions={[{
name: 'edit'
}, {
name: 'copy'
}, {
name: 'delete'
}]}
columns={[{
name: 'name',
label: i18n.t('ReferenceTableModal.referenceCodes.columns.name')
}]}
items={props.item.reference_codes}
modal={{
component: ReferenceCodeModal,
props: {
required: ['name']
}
}}
onDelete={props.onDeleteChildAssociation.bind(this, 'reference_codes')}
onSave={props.onSaveChildAssociation.bind(this, 'reference_codes')}
/>
</Modal.Content>
{ props.children }
</Modal>
);

export default ReferenceTableModal;
Empty file.
44 changes: 44 additions & 0 deletions packages/semantic-ui/src/components/ReferenceTablesList.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
// @flow

import { ReferenceTablesService } from '@performant-software/shared-components';
import React from 'react';
import ListTable from './ListTable';
import ReferenceTableModal from './ReferenceTableModal';

const ReferenceTablesList = () => (
<ListTable
actions={[{
name: 'edit'
}, {
name: 'copy'
}, {
name: 'delete'
}]}
collectionName='reference_tables'
columns={[{
name: 'name',
label: 'Name',
sortable: true
}, {
name: 'key',
label: 'Key',
sortable: true
}]}
modal={{
component: ReferenceTableModal,
props: {
onInitialize: (id) => (
ReferenceTablesService
.fetchOne(id)
.then(({ data }) => data.reference_table)
),
required: ['name', 'key']
}
}}
onDelete={(referenceTable) => ReferenceTablesService.delete(referenceTable)}
onLoad={(params) => ReferenceTablesService.fetchAll(params)}
onSave={(referenceTable) => ReferenceTablesService.save(referenceTable)}
/>
);

export default ReferenceTablesList;
25 changes: 25 additions & 0 deletions packages/semantic-ui/src/i18n/en.json
Original file line number Diff line number Diff line change
Expand Up @@ -183,6 +183,31 @@
"loginErrorHeader": "Invalid Credentials",
"password": "Password"
},
"ReferenceCodeModal": {
"labels": {
"name": "Name"
},
"title": {
"add": "Add Reference Code",
"edit": "Edit Reference Code"
}
},
"ReferenceTableModal": {
"labels": {
"key": "Key",
"name": "Name",
"referenceCodes": "Reference Codes"
},
"referenceCodes": {
"columns": {
"name": "Name"
}
},
"title": {
"add": "Add Reference Table",
"edit": "Edit Reference Table"
}
},
"RemoteDropdown": {
"labels": {
"add": "Add",
Expand Down
4 changes: 4 additions & 0 deletions packages/semantic-ui/src/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,10 @@ export { default as ModalDropdown } from './components/ModalDropdown';
export { default as NestedAccordion } from './components/NestedAccordion';
export { default as PlayButton } from './components/PlayButton';
export { default as PhotoViewer } from './components/PhotoViewer';
export { default as ReferenceCodeDropdown } from './components/ReferenceCodeDropdown';
export { default as ReferenceCodeModal } from './components/ReferenceCodeModal';
export { default as ReferenceTableModal } from './components/ReferenceTableModal';
export { default as ReferenceTablesList } from './components/ReferenceTablesList';
export { default as RemoteDropdown } from './components/RemoteDropdown';
export { default as SaveButton } from './components/SaveButton';
export { default as Section } from './components/Section';
Expand Down
4 changes: 2 additions & 2 deletions packages/shared/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@performant-software/shared-components",
"version": "0.5.2",
"version": "0.5.3",
"description": "A package of shared, framework agnostic, components.",
"license": "MIT",
"main": "./build/index.js",
Expand Down Expand Up @@ -28,7 +28,7 @@
"react-dom": ">= 16.13.1 < 18.0.0"
},
"devDependencies": {
"@performant-software/webpack-config": "^0.5.2",
"@performant-software/webpack-config": "^0.5.3",
"react": "^17.0.2",
"react-dom": "^17.0.2"
}
Expand Down
18 changes: 11 additions & 7 deletions packages/shared/src/index.js
Original file line number Diff line number Diff line change
@@ -1,12 +1,5 @@
// @flow

// API
export { default as Attachments } from './api/Attachments';
export { default as BaseService } from './api/BaseService';
export { default as BaseTransform } from './api/BaseTransform';
export { default as FormDataTransform } from './api/FormDataTransform';
export { default as NestedAttributesTransform } from './api/NestedAttributesTransform';

// Components
export { default as useEditContainer } from './components/EditContainer';
export { default as withGoogleAnalytics } from './components/GoogleAnalytics';
Expand All @@ -17,6 +10,17 @@ export { default as Keyboard } from './components/Keyboard';
// I18n
export { default as i18n } from './i18n/i18n';

// Services
export { default as BaseService } from './services/BaseService';
export { default as ReferenceCodesService } from './services/ReferenceCodes';
export { default as ReferenceTablesService } from './services/ReferenceTables';

// Transforms
export { default as Attachments } from './transforms/Attachments';
export { default as BaseTransform } from './transforms/BaseTransform';
export { default as FormDataTransform } from './transforms/FormDataTransform';
export { default as NestedAttributesTransform } from './transforms/NestedAttributesTransform';

// Utils
export * as Browser from './utils/Browser';
export { default as Calendar } from './utils/Calendar';
Expand Down
Loading

0 comments on commit 7593975

Please sign in to comment.