UNPKG

@plurid/joiner

Version:
1,530 lines (1,459 loc) 130 kB
'use strict'; Object.defineProperty(exports, '__esModule', { value: true }); var PluridServer = require('@plurid/plurid-react-server'); var client$1 = require('@apollo/client'); var reactRedux = require('react-redux'); var redux = require('redux'); var thunk = require('redux-thunk'); var themes$1 = require('@plurid/plurid-themes'); var React = require('react'); var fetch = require('cross-fetch'); var pluridUiComponentsReact = require('@plurid/plurid-ui-components-react'); var styled = require('styled-components'); var gql = require('graphql-tag'); var pluridIconsReact = require('@plurid/plurid-icons-react'); var pluridFunctionsReact = require('@plurid/plurid-functions-react'); var pluridFunctions = require('@plurid/plurid-functions'); var pluridReact = require('@plurid/plurid-react'); var reactHelmetAsync = require('react-helmet-async'); var fs = require('fs'); var os = require('os'); var path = require('path'); var bodyParser = require('body-parser'); var cookieParser = require('cookie-parser'); var apolloServerExpress = require('apollo-server-express'); var apolloServerCore = require('apollo-server-core'); var merge = require('lodash.merge'); var yaml = require('js-yaml'); var Deon = require('@plurid/deon'); var crypto = require('crypto'); var child_process = require('child_process'); function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; } var PluridServer__default = /*#__PURE__*/_interopDefaultLegacy(PluridServer); var thunk__default = /*#__PURE__*/_interopDefaultLegacy(thunk); var themes__default = /*#__PURE__*/_interopDefaultLegacy(themes$1); var React__default = /*#__PURE__*/_interopDefaultLegacy(React); var fetch__default = /*#__PURE__*/_interopDefaultLegacy(fetch); var styled__default = /*#__PURE__*/_interopDefaultLegacy(styled); var gql__default = /*#__PURE__*/_interopDefaultLegacy(gql); var fs__default = /*#__PURE__*/_interopDefaultLegacy(fs); var os__default = /*#__PURE__*/_interopDefaultLegacy(os); var path__default = /*#__PURE__*/_interopDefaultLegacy(path); var cookieParser__default = /*#__PURE__*/_interopDefaultLegacy(cookieParser); var merge__default = /*#__PURE__*/_interopDefaultLegacy(merge); var yaml__default = /*#__PURE__*/_interopDefaultLegacy(yaml); var Deon__default = /*#__PURE__*/_interopDefaultLegacy(Deon); var crypto__default = /*#__PURE__*/_interopDefaultLegacy(crypto); // #region module const helmetContext = {}; // #endregion exports // #region module const environment = { local: process.env.ENV_MODE === 'local', localExternal: process.env.ENV_MODE === 'localExternal', development: process.env.ENV_MODE === 'development', production: process.env.ENV_MODE === 'production', }; // #endregion exports const ADD_ENTITY = 'ADD_ENTITY'; const REMOVE_ENTITY = 'REMOVE_ENTITY'; const ADD_ENTITIES = 'ADD_ENTITIES'; const REMOVE_ENTITIES = 'REMOVE_ENTITIES'; const CLEAR_DATA = 'CLEAR_DATA'; // #endregion module var index$2 = /*#__PURE__*/Object.freeze({ __proto__: null, ADD_ENTITY: ADD_ENTITY, REMOVE_ENTITY: REMOVE_ENTITY, ADD_ENTITIES: ADD_ENTITIES, REMOVE_ENTITIES: REMOVE_ENTITIES, CLEAR_DATA: CLEAR_DATA }); // #region imports // #endregion external // #endregion imports // #region module const addEntity$1 = (payload) => { return { type: ADD_ENTITY, payload, }; }; const removeEntity$1 = (payload) => { return { type: REMOVE_ENTITY, payload, }; }; const addEntities$1 = (payload) => { return { type: ADD_ENTITIES, payload, }; }; const removeEntities$1 = (payload) => { return { type: REMOVE_ENTITIES, payload, }; }; const clearData$1 = () => { return { type: CLEAR_DATA, payload: undefined, }; }; const actions$3 = { addEntity: addEntity$1, removeEntity: removeEntity$1, addEntities: addEntities$1, removeEntities: removeEntities$1, clearData: clearData$1, }; // #endregion exports // #endregion external // #endregion imports // #region module const initialState$2 = { id: '', configurations: [], logs: [], }; // #endregion exports // #endregion internal // #endregion imports // #region module const addEntity = (state, action) => { const { type, data, } = action.payload; const newState = Object.assign({}, state); let configurations = [ ...newState.configurations, ]; switch (type) { case 'configuration': configurations = [ ...configurations, Object.assign({}, data), ]; break; } return Object.assign(Object.assign({}, newState), { configurations: [ ...configurations, ] }); }; const removeEntity = (state, action) => { const { id, type, } = action.payload; const newState = Object.assign({}, state); let configurations = [ ...newState.configurations, ]; switch (type) { case 'configuration': configurations = configurations.filter(configuration => configuration.id !== id); break; } return Object.assign(Object.assign({}, newState), { configurations: [ ...configurations, ] }); }; const addEntities = (state, action) => { const { type, data, push, } = action.payload; const newState = Object.assign({}, state); let configurations = [ ...newState.configurations, ]; switch (type) { case 'configurations': configurations = [ ...data, ]; break; } return Object.assign(Object.assign({}, newState), { configurations: [ ...configurations, ] }); }; const removeEntities = (state, action) => { action.payload; const newState = Object.assign({}, state); // switch (type) { // } return Object.assign({}, newState); }; const clearData = (state, action) => { return Object.assign({}, initialState$2); }; const resolvers$4 = { addEntity, removeEntity, addEntities, removeEntities, clearData, }; // #endregion exports // #region imports // #endregion external // #endregion imports // #region module const reducer$2 = (state = initialState$2, action) => { switch (action.type) { case ADD_ENTITY: return resolvers$4.addEntity(state, action); case REMOVE_ENTITY: return resolvers$4.removeEntity(state, action); case ADD_ENTITIES: return resolvers$4.addEntities(state, action); case REMOVE_ENTITIES: return resolvers$4.removeEntities(state, action); case CLEAR_DATA: return resolvers$4.clearData(state, action); default: return Object.assign({}, state); } }; // #endregion exports // #endregion external // #endregion imports // #region module const getID = (state) => state.data.id; const getConfigurations$1 = (state) => state.data.configurations; const getLogs = (state) => state.data.logs; const selectors$3 = { getID, getConfigurations: getConfigurations$1, getLogs, }; // #endregion exports // #region imports // #endregion exports var data = /*#__PURE__*/Object.freeze({ __proto__: null, actions: actions$3, initialState: initialState$2, reducer: reducer$2, resolvers: resolvers$4, selectors: selectors$3, Types: index$2 }); // #endregion libraries // #endregion imports // #region module const SET_GENERAL_THEME = 'SET_GENERAL_THEME'; const SET_INTERACTION_THEME = 'SET_INTERACTION_THEME'; // #endregion module var index$1 = /*#__PURE__*/Object.freeze({ __proto__: null, SET_GENERAL_THEME: SET_GENERAL_THEME, SET_INTERACTION_THEME: SET_INTERACTION_THEME }); // #endregion libraries // #endregion externalr // #endregion imports // #region module const setGeneralTheme$1 = (theme) => { return { type: SET_GENERAL_THEME, payload: theme, }; }; const setInteractionTheme$1 = (theme) => { return { type: SET_INTERACTION_THEME, payload: theme, }; }; const actions$2 = { setGeneralTheme: setGeneralTheme$1, setInteractionTheme: setInteractionTheme$1, }; // #endregion exports // #region imports // #endregion external // #endregion imports // #region module const initialState$1 = { general: themes__default["default"].plurid, interaction: themes__default["default"].plurid, }; // #endregion exports // #endregion external // #endregion imports // #region module const setGeneralTheme = (state, action) => { return Object.assign(Object.assign({}, state), { general: Object.assign({}, action.payload) }); }; const setInteractionTheme = (state, action) => { return Object.assign(Object.assign({}, state), { interaction: Object.assign({}, action.payload) }); }; const resolvers$3 = { setGeneralTheme, setInteractionTheme, }; // #endregion exports // #region imports // #endregion external // #endregion imports // #region module const reducer$1 = (state = initialState$1, action) => { switch (action.type) { case SET_GENERAL_THEME: return resolvers$3.setGeneralTheme(state, action); case SET_INTERACTION_THEME: return resolvers$3.setInteractionTheme(state, action); default: return Object.assign({}, state); } }; const metareducer = (initialState) => (state = initialState, actions) => reducer$1(state, actions); // #endregion exports // #endregion external // #endregion imports // #region module const getGeneralTheme = (state) => state.themes.general; const getInteractionTheme = (state) => state.themes.interaction; const selectors$2 = { getGeneralTheme, getInteractionTheme, }; // #endregion exports // #region imports // #endregion exports var themes = /*#__PURE__*/Object.freeze({ __proto__: null, actions: actions$2, initialState: initialState$1, reducer: reducer$1, metareducer: metareducer, resolvers: resolvers$3, selectors: selectors$2, Types: index$1 }); // #region imports // #region libraries // #endregion libraries // #endregion imports // #region module const SET_VIEW_LOADING = 'SET_VIEW_LOADING'; const SET_VIEW_TYPE = 'SET_VIEW_TYPE'; const SET_EDIT_ID = 'SET_EDIT_ID'; const SET_VIEW_COMPACT_SELECTORS = 'SET_VIEW_COMPACT_SELECTORS'; const SET_VIEW_OWNER_ID = 'SET_VIEW_OWNER_ID'; const SET_VIEW_USAGE_TYPE = 'SET_VIEW_USAGE_TYPE'; // #endregion module var index = /*#__PURE__*/Object.freeze({ __proto__: null, SET_VIEW_LOADING: SET_VIEW_LOADING, SET_VIEW_TYPE: SET_VIEW_TYPE, SET_EDIT_ID: SET_EDIT_ID, SET_VIEW_COMPACT_SELECTORS: SET_VIEW_COMPACT_SELECTORS, SET_VIEW_OWNER_ID: SET_VIEW_OWNER_ID, SET_VIEW_USAGE_TYPE: SET_VIEW_USAGE_TYPE }); // #region imports // #endregion external // #endregion imports // #region module const setViewLoading$1 = (payload) => { return { type: SET_VIEW_LOADING, payload, }; }; const setViewType$1 = (payload) => { return { type: SET_VIEW_TYPE, payload, }; }; const setEditID$1 = (payload) => { return { type: SET_EDIT_ID, payload, }; }; const setViewCompactSelectors$1 = (payload) => { return { type: SET_VIEW_COMPACT_SELECTORS, payload, }; }; const setViewOwnerID$1 = (id) => { return { type: SET_VIEW_OWNER_ID, payload: id, }; }; const setViewUsageType$1 = (usageType) => { return { type: SET_VIEW_USAGE_TYPE, payload: usageType, }; }; const actions$1 = { setViewLoading: setViewLoading$1, setViewType: setViewType$1, setEditID: setEditID$1, setViewCompactSelectors: setViewCompactSelectors$1, setViewOwnerID: setViewOwnerID$1, setViewUsageType: setViewUsageType$1, }; // #endregion exports // #endregion external // #endregion imports // #region module const initialState = { loading: true, indexView: '', indexGeneralView: 'general', indexGeneralSelector: 'configurations', indexEditWebhookID: '', indexEditTriggerID: '', compactSelectors: false, ownerID: '', usageType: '', }; // #endregion exports // #endregion internal // #endregion imports // #region module const setViewLoading = (state, action) => { return Object.assign(Object.assign({}, state), { loading: action.payload }); }; const setViewType = (state, action) => { const { type, value, } = action.payload; switch (type) { case 'indexView': return Object.assign(Object.assign({}, state), { indexView: value }); case 'indexGeneralView': return Object.assign(Object.assign({}, state), { indexGeneralView: value }); case 'indexGeneralSelector': return Object.assign(Object.assign({}, state), { indexGeneralSelector: value }); default: return Object.assign({}, state); } }; const setEditID = (state, action) => { const { type, value, } = action.payload; switch (type) { case 'trigger': return Object.assign(Object.assign({}, state), { indexEditTriggerID: value }); case 'webhook': return Object.assign(Object.assign({}, state), { indexEditWebhookID: value }); default: return Object.assign({}, state); } }; const setViewCompactSelectors = (state, action) => { return Object.assign(Object.assign({}, state), { compactSelectors: action.payload }); }; const setViewOwnerID = (state, action) => { return Object.assign(Object.assign({}, state), { ownerID: action.payload }); }; const setViewUsageType = (state, action) => { return Object.assign(Object.assign({}, state), { usageType: action.payload }); }; const resolvers$2 = { setViewLoading, setViewType, setEditID, setViewCompactSelectors, setViewOwnerID, setViewUsageType, }; // #endregion exports // #region imports // #endregion external // #endregion imports // #region module const reducer = (state = initialState, action) => { switch (action.type) { case SET_VIEW_LOADING: return resolvers$2.setViewLoading(state, action); case SET_VIEW_TYPE: return resolvers$2.setViewType(state, action); case SET_EDIT_ID: return resolvers$2.setEditID(state, action); case SET_VIEW_COMPACT_SELECTORS: return resolvers$2.setViewCompactSelectors(state, action); case SET_VIEW_OWNER_ID: return resolvers$2.setViewOwnerID(state, action); case SET_VIEW_USAGE_TYPE: return resolvers$2.setViewUsageType(state, action); default: return Object.assign({}, state); } }; // #endregion exports // #endregion external // #endregion imports // #region module const getLoading = (state) => state.view.loading; const getIndexView = (state) => state.view.indexView; const getIndexGeneralView = (state) => state.view.indexGeneralView; const getIndexGeneralSelector = (state) => state.view.indexGeneralSelector; const getIndexEditTriggerID = (state) => state.view.indexEditTriggerID; const getIndexEditWebhookID = (state) => state.view.indexEditWebhookID; const getViewCompactSelectors = (state) => state.view.compactSelectors; const getViewOwnerID = (state) => state.view.ownerID; const getViewUsageType = (state) => state.view.usageType; const selectors$1 = { getLoading, getIndexView, getIndexGeneralView, getIndexGeneralSelector, getViewCompactSelectors, getIndexEditTriggerID, getIndexEditWebhookID, getViewOwnerID, getViewUsageType, }; // #endregion exports // #region imports // #endregion exports var view = /*#__PURE__*/Object.freeze({ __proto__: null, actions: actions$1, initialState: initialState, reducer: reducer, resolvers: resolvers$2, selectors: selectors$1, Types: index }); // #region imports // #endregion internal // #endregion imports // #region exports var modules = { data, themes, view, }; // #endregion exports // #region imports // #endregion external // #endregion imports // #region module const reducers = redux.combineReducers({ data: modules.data.reducer, themes: modules.themes.reducer, view: modules.view.reducer, }); // #endregion exports // #region imports const store$2 = (preloadedState) => { // const localState = localStorage.loadState(); // const persistedState = { // themes: localState?.themes, // }; const _store = redux.createStore(reducers, preloadedState, // persistedState || preloadedState, redux.applyMiddleware(thunk__default["default"])); // _store.subscribe( // () => { // const localState = localStorage.loadState(); // localStorage.saveState({ // ...localState, // themes: _store.getState().themes, // }); // }, // ); return _store; }; // #endregion exports // #region imports // #endregion external // #endregion imports // #region module let composeWithDevTools; if (!environment.production) { try { const reduxDevTools = require('@redux-devtools/extension'); composeWithDevTools = reduxDevTools.composeWithDevTools; } catch (error) { composeWithDevTools = undefined; } } const store$1 = (preloadedState) => { const middleware = [ thunk__default["default"], ]; // const localState = localStorage.loadState(); // const persistedState = { // themes: localState?.themes, // }; const _store = redux.createStore(reducers, preloadedState, // persistedState || preloadedState, composeWithDevTools(redux.applyMiddleware(...middleware))); // _store.subscribe( // () => { // const localState = localStorage.loadState(); // localStorage.saveState({ // ...localState, // themes: _store.getState().themes, // }); // }, // ); return _store; }; // #endregion exports // #region imports const store = environment.production ? store$2 : store$1; // #endregion exports // #region imports // #endregion libraries // #endregion imports // #region module var reduxContext = React__default["default"].createContext({}); // #endregion module // #region module const GRAPHQL_FAVICON = '/favicon.ico'; const GRAPHQL_TITLE = 'API · joiner'; const GRAPHQL_ENDPOINT = process.env.JOINER_ENDPOINT_GRAPHQL || '/joiner'; // #endregion module // #region imports // #endregion external // #endregion imports // #region module const client = new client$1.ApolloClient({ link: client$1.createHttpLink({ uri: GRAPHQL_ENDPOINT, credentials: 'include', fetch: fetch__default["default"], }), cache: new client$1.InMemoryCache(), }); // #endregion exports // #region imports // #endregion external // #endregion imports // #region module const selectors = { data: modules.data.selectors, themes: modules.themes.selectors, view: modules.view.selectors, }; // #endregion exports var joinerLogo = "client/assets/joiner-logo.png"; // #region imports const StyledInitialView = styled__default["default"].div.withConfig({ displayName: "StyledInitialView", componentId: "-69p5dr" }) ` padding: 3rem; display: grid; place-content: center; text-align: center; h1 { font-size: 1.3rem; margin: 1.5rem; } h2 { font-size: 1.1rem; margin: 1.5rem; } `; // #endregion module // #region imports // #endregion internal // #endregion imports // #region module const { buttons: { PureButton: PluridPureButton$2, }, } = pluridUiComponentsReact.universal; const InitialView = (properties) => { // #region properties // const { // } = properties; // #endregion properties // #region render return (React__default["default"].createElement(StyledInitialView, null, React__default["default"].createElement("div", null, React__default["default"].createElement("img", { src: joinerLogo, alt: "joiner logo", height: 250 })), React__default["default"].createElement("h1", null, "joiner"), React__default["default"].createElement("h2", null, "Multi/Mono-Repository Task Runner"), React__default["default"].createElement("div", { style: { width: '200px', margin: '50px auto', } }, React__default["default"].createElement(PluridPureButton$2, { text: "Initial Setup", atClick: () => { // setView('setup'); }, level: 2 })))); // #endregion render }; // #endregion exports /****************************************************************************** Copyright (c) Microsoft Corporation. Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. ***************************************************************************** */ function __awaiter(thisArg, _arguments, P, generator) { function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } return new (P || (P = Promise))(function (resolve, reject) { function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } step((generator = generator.apply(thisArg, _arguments || [])).next()); }); } // #region module const JOINER_MANUAL_LINK = 'https://manual.plurid.com/joiner'; // #endregion module // #region imports // #endregion libraries // #endregion imports // #region module const OBLITERATE_CONFIGURATION = gql__default["default"] ` mutation ObliterateConfiguration($input: InputValueString!) { obliterateConfiguration(input: $input) { status error { type path message } } } `; const OBLITERATE_LOG = gql__default["default"] ` mutation ObliterateLog($input: InputValueString!) { obliterateLog(input: $input) { status error { type path message } } } `; const EXECUTE_COMMAND = gql__default["default"] ` mutation ExecuteCommand($input: InputExecuteCommand!) { executeCommand(input: $input) { status error { type path message } } } `; const LOGIN = gql__default["default"] ` mutation Login($input: InputLogin!) { login(input: $input) { status error { type path message } data { id } } } `; const LOGOUT = gql__default["default"] ` mutation Logout { logout { status error { type path message } } } `; // #endregion module // #region imports // #endregion external // #endregion imports // #region module const actions = { data: actions$3, themes: actions$2, view: actions$1, }; // #endregion exports // #region module const compareValues = (key, order = 'asc') => { return (a, b) => { if (!a.hasOwnProperty(key) || !b.hasOwnProperty(key)) { // property doesn't exist on either object return 0; } const varA = (typeof a[key] === 'string') ? a[key].toUpperCase() : a[key]; const varB = (typeof b[key] === 'string') ? b[key].toUpperCase() : b[key]; let comparison = 0; if (varA > varB) { comparison = 1; } else if (varA < varB) { comparison = -1; } return ((order === 'desc') ? (comparison * -1) : comparison); }; }; // #endregion module // #region imports const StyledEntityView = styled__default["default"].div.withConfig({ displayName: "StyledEntityView", componentId: "-ojp1ub" }) ` position: relative; height: 100%; button { font-family: 'Ubuntu', -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Open Sans', 'Helvetica Neue', sans-serif; } `; const StyledEntityViewTop = styled__default["default"].div.withConfig({ displayName: "StyledEntityViewTop", componentId: "-1mk7sxg" }) ` display: grid; grid-template-columns: 3fr 1fr; align-items: center; margin-bottom: 30px; `; const StyledEntityFilterLine = styled__default["default"].div.withConfig({ displayName: "StyledEntityFilterLine", componentId: "-1kqmxs8" }) ` position: relative; `; const StyledEntityFilterCancel = styled__default["default"].div.withConfig({ displayName: "StyledEntityFilterCancel", componentId: "-5bvbq6" }) ` position: absolute; top: 10px; left: ${({ filterLength, }) => filterLength === 'SMALL' ? '275px' : '575px'}; `; const StyledTopButtons = styled__default["default"].div.withConfig({ displayName: "StyledTopButtons", componentId: "-6gpxw9" }) ` text-align: right; `; const StyledEntityListContainer = styled__default["default"].div.withConfig({ displayName: "StyledEntityListContainer", componentId: "-1bqy0ns" }) ` `; const StyledEntityList = styled__default["default"].ul.withConfig({ displayName: "StyledEntityList", componentId: "-jwxljr" }) ` padding: 0; margin: 0; list-style: none; max-height: 500px; overflow: auto; background-color: ${({ theme, }) => theme.backgroundColorSecondaryAlpha}; box-shadow: ${({ theme, }) => theme.boxShadowUmbraInset}; opacity: ${({ loading, }) => { if (loading) { return '0.5'; } return '1'; }}; li:first-child { background-color: ${({ theme, header, }) => { if (header) { return theme.backgroundColorTertiary; } return 'initial'; }}; } ${({ header, }) => { if (header) { return; } return styled.css ` li:hover { background-color: ${({ theme, }) => theme.backgroundColorPrimary}; } `; }} `; const StyledEntityListItem = styled__default["default"].li.withConfig({ displayName: "StyledEntityListItem", componentId: "-u9f1n6" }) ` display: grid; grid-template-columns: ${({ rowTemplate, }) => rowTemplate}; grid-gap: 0.5rem; padding: 0.7rem; align-items: center; min-height: 45px; word-break: break-all; `; const StyledActionButton = styled__default["default"].div.withConfig({ displayName: "StyledActionButton", componentId: "-wyrzno" }) ` width: 200px; position: absolute; bottom: 0; right: 0; `; const StyledNoRows = styled__default["default"].div.withConfig({ displayName: "StyledNoRows", componentId: "-i1cr7z" }) ` margin: 20px 0; text-align: center; `; // #endregion module // #region imports // #endregion internal // #endregion imports // #region module const { buttons: { PureButton: PluridPureButton$1, }, inputs: { Textline: PluridTextline, }, markers: { Spinner: PluridSpinner, }, } = pluridUiComponentsReact.universal; const EntityView = React.forwardRef((properties, reference) => { // #region properties const { // #region required // #region values generalTheme, interactionTheme, rowsHeader, rowTemplate, rows, noRows, // #endregion values // #region methods // #endregion methods // #endregion required // #region optional // #region values. entities, actionButtonText, loading, // #endregion values // #region methods actionButtonClick, filterUpdate, refresh, actionScrollBottom, // #endregion methods // #endregion optional } = properties; // #endregion properties // #region references const bottomTimeout = React.useRef(null); const entityList = React.useRef(null); // #endregion references // #region state const [searchValue, setSearchValue,] = React.useState(''); const [filterLength, setFilterLength,] = React.useState('SMALL'); const [refreshClicked, setRefreshClicked,] = React.useState(false); // #endregion state // #region handlers const handleScroll = pluridFunctionsReact.useThrottledCallback(() => { const element = entityList.current; if (!element) { return; } const scrolledAmount = element.scrollTop + element.getBoundingClientRect().height; const bottomReached = scrolledAmount >= element.scrollHeight; if (bottomReached && actionScrollBottom && entities) { actionScrollBottom(entities); } }, 1000); const clearFilterValue = () => { setSearchValue(''); if (filterUpdate) { filterUpdate(''); } }; // #endregion handlers // #region effects React.useEffect(() => { if (refreshClicked) { setTimeout(() => { setRefreshClicked(false); }, 1500); } }, [ refreshClicked, ]); /** * Action at Bottom of List. */ React.useEffect(() => { bottomTimeout.current = setTimeout(() => { if (entityList.current && actionScrollBottom) { entityList.current.addEventListener('scroll', handleScroll); } }, 100); return () => { if (bottomTimeout.current) { clearTimeout(bottomTimeout.current); } if (entityList.current && actionScrollBottom) { entityList.current.removeEventListener('scroll', handleScroll); } }; }, [ entities, ]); /** * Filter length */ React.useEffect(() => { if (searchValue.length <= 30) { if (filterLength !== 'SMALL') { setFilterLength('SMALL'); } } else { if (filterLength !== 'LARGE') { setFilterLength('LARGE'); } } }, [ searchValue, ]); React.useImperativeHandle(reference, () => ({ resetFilterValue() { clearFilterValue(); } })); // #endregion effects // #region render return (React__default["default"].createElement(StyledEntityView, { theme: generalTheme }, !!loading && (React__default["default"].createElement(PluridSpinner, { theme: generalTheme })), React__default["default"].createElement(StyledEntityViewTop, null, React__default["default"].createElement(StyledEntityFilterLine, null, React__default["default"].createElement(PluridTextline, { text: searchValue, placeholder: "filter", atChange: (event) => { const { value, } = event.target; setSearchValue(value); if (filterUpdate) { filterUpdate(value); } }, atKeyDown: (event) => { if (event.key === 'Escape') { clearFilterValue(); } }, theme: interactionTheme, spellCheck: false, autoCapitalize: "false", autoComplete: "false", autoCorrect: "false", level: 2, style: { width: filterLength === 'SMALL' ? '300px' : '600px', paddingRight: '2rem', } }), searchValue && (React__default["default"].createElement(StyledEntityFilterCancel, { filterLength: filterLength }, React__default["default"].createElement(pluridIconsReact.PluridIconDelete, { atClick: () => { clearFilterValue(); } })))), React__default["default"].createElement(StyledTopButtons, null, refresh && !refreshClicked && (React__default["default"].createElement(pluridIconsReact.PluridIconReset, { atClick: () => { setRefreshClicked(true); refresh(); }, theme: generalTheme })))), rows.length === 0 && (React__default["default"].createElement(StyledNoRows, null, noRows)), rows.length !== 0 && (React__default["default"].createElement(StyledEntityListContainer, { theme: generalTheme }, React__default["default"].createElement(StyledEntityList, { theme: generalTheme, header: true }, React__default["default"].createElement(StyledEntityListItem, { rowTemplate: rowTemplate }, rowsHeader)), React__default["default"].createElement(StyledEntityList, { theme: generalTheme, ref: entityList, loading: loading }, rows.map(row => { return (React__default["default"].createElement(StyledEntityListItem, { key: Math.random() + '', rowTemplate: rowTemplate }, row)); })))), actionButtonText && (React__default["default"].createElement(StyledActionButton, null, React__default["default"].createElement(PluridPureButton$1, { text: actionButtonText, atClick: () => actionButtonClick ? actionButtonClick() : undefined, theme: interactionTheme, level: 2 }))))); // #endregion render }); // #endregion exports // #region imports // #endregion libraries // #endregion imports // #region module const GET_CURRENT_OWNER = gql__default["default"] ` query GetCurrentOwner { getCurrentOwner { status error { path type message } data { id configurations { id path name packages } } } } `; const GET_USAGE_TYPE = gql__default["default"] ` query GetUsageType { getUsageType { status error { path type message } data } } `; // #endregion module // #endregion external // #endregion imports // #region module /** * Get current owner. * * @param dispatch */ const getCurrentOwner$1 = (dispatch) => __awaiter(void 0, void 0, void 0, function* () { const dispatchSetOwnerID = (payload) => dispatch(actions.view.setViewOwnerID(payload)); const dispatchDataAddEntities = (payload) => dispatch(actions.data.addEntities(payload)); try { const query = yield client.query({ query: GET_CURRENT_OWNER, fetchPolicy: 'no-cache', }); const response = query.data.getCurrentOwner; if (!response.status) { return false; } const { id, configurations, } = pluridFunctions.graphql.deleteTypenames(response.data); dispatchSetOwnerID(id); dispatchDataAddEntities({ type: 'configurations', data: configurations, }); return true; } catch (error) { return false; } }); /** * Get current owner and return true if set. * * @param setViewUsageType */ const getUsageType$1 = (setViewUsageType) => __awaiter(void 0, void 0, void 0, function* () { const query = yield client.query({ query: GET_USAGE_TYPE, }); const response = query.data.getUsageType; if (response.status) { const usageType = response.data; setViewUsageType(usageType); switch (usageType) { case 'PRIVATE_USAGE': return 'private'; case 'PUBLIC': return 'general'; case 'CUSTOM_LOGIC': return 'general'; } } return; }); // #endregion exports // #region module const getFilterIDs = (filterTerms, value) => { const filterIDs = []; for (const filterTerm of filterTerms) { let added = false; for (const filterTermData of filterTerm.data) { if (filterTermData.includes(value)) { if (!added) { filterIDs.push(filterTerm.id); added = true; } } } } return filterIDs; }; // #endregion module // #region imports // #endregion external // #endregion imports // #region module const { varia: { CopyableLine: PluridCopyableLine, }, } = pluridUiComponentsReact.universal; const configurationRowRenderer = (configuration, handleConfigurationObliterate) => { const { id, name, path, } = configuration; return (React__default["default"].createElement(React__default["default"].Fragment, null, name ? (React__default["default"].createElement("div", null, name)) : (React__default["default"].createElement(PluridCopyableLine, { data: path })), React__default["default"].createElement(pluridReact.PluridLink, { route: `/configuration/${id}`, devisible: true, style: { display: 'grid', } }, React__default["default"].createElement(pluridIconsReact.PluridIconInfo // title="details" , { // title="details" atClick: () => { } })), React__default["default"].createElement(pluridIconsReact.PluridIconDelete // title="deregister" , { // title="deregister" atClick: () => handleConfigurationObliterate(id) }))); }; const createSearchTerms$1 = (configurations) => { const searchTerms = configurations.map(configuration => { const { id, path, } = configuration; const searchTerm = { id, data: [ path.toLowerCase(), id.toLowerCase(), ], }; return searchTerm; }); return searchTerms; }; // #endregion module const ConfigurationsView = (properties) => { // #region properties const { // #region required // #region values // #endregion values // #region methods setGeneralView, // #endregion methods // #endregion required // #region optional // #region values // #endregion values // #region methods // #endregion methods // #endregion optional // #region state stateGeneralTheme, stateInteractionTheme, stateConfigurations, // #endregion state // #region dispatch dispatch, dispatchRemoveEntity, // #endregion dispatch } = properties; // #endregion properties // #region handlers const handleConfigurationObliterate = (id) => __awaiter(void 0, void 0, void 0, function* () { try { dispatchRemoveEntity({ type: 'configuration', id, }); const input = { value: id, }; yield client.mutate({ mutation: OBLITERATE_CONFIGURATION, variables: { input, }, }); } catch (error) { return; } }); // #endregion handlers // #region state const [searchTerms, setSearchTerms] = React.useState(createSearchTerms$1(stateConfigurations)); const [filteredRows, setFilteredRows] = React.useState(stateConfigurations.map(configuration => configurationRowRenderer(configuration, handleConfigurationObliterate))); // #endregion state // #region handlers const filterUpdate = (rawValue) => { const value = rawValue.toLowerCase(); const filterIDs = getFilterIDs(searchTerms, value); const filteredConfigurations = stateConfigurations.filter(stateConfiguration => { if (filterIDs.includes(stateConfiguration.id)) { return true; } return false; }); const sortedConfigurations = filteredConfigurations.sort(compareValues('name')); setFilteredRows(sortedConfigurations.map(configuration => configurationRowRenderer(configuration, handleConfigurationObliterate))); }; const registerJoiner = () => __awaiter(void 0, void 0, void 0, function* () { const input = document.createElement('input'); input.setAttribute('type', 'file'); input.setAttribute('accept', '.json, .deon'); input.addEventListener('change', (event) => { try { const files = event.path[0].files; const file = files[0]; // read contents // send name and contents to backend to find the file // register it as joiner } catch (error) { return; } }); input.click(); }); // #endregion handlers // #region effects React.useEffect(() => { const searchTerms = createSearchTerms$1(stateConfigurations); const filteredRows = stateConfigurations.map(configuration => configurationRowRenderer(configuration, handleConfigurationObliterate)); setSearchTerms(searchTerms); setFilteredRows(filteredRows); }, [ stateConfigurations, ]); // #endregion effects // #region render const rowsHeader = (React__default["default"].createElement(React__default["default"].Fragment, null, React__default["default"].createElement("div", null, "joiner"), React__default["default"].createElement("div", null), React__default["default"].createElement("div", null))); return (React__default["default"].createElement(EntityView, { generalTheme: stateGeneralTheme, interactionTheme: stateInteractionTheme, rowTemplate: "3fr 30px 30px", rowsHeader: rowsHeader, rows: filteredRows, noRows: "no configurations", filterUpdate: filterUpdate, refresh: () => { getCurrentOwner$1(dispatch); }, actionButtonText: "Register Joiner", actionButtonClick: () => { registerJoiner(); } })); // #endregion render }; const mapStateToProperties$7 = (state) => ({ stateGeneralTheme: selectors.themes.getGeneralTheme(state), stateInteractionTheme: selectors.themes.getInteractionTheme(state), stateConfigurations: selectors.data.getConfigurations(state), }); const mapDispatchToProperties$7 = (dispatch) => ({ dispatch, dispatchRemoveEntity: (payload) => dispatch(actions.data.removeEntity(payload)), }); const ConnectedConfigurationsView = reactRedux.connect(mapStateToProperties$7, mapDispatchToProperties$7, null, { context: reduxContext, })(ConfigurationsView); // #endregion exports // #region imports // #endregion external // #endregion imports // #region module const logRowRenderer = (log, handleLogObliterate) => { const { id, package: packageName, command, startAt, finishedAt, } = log; return (React__default["default"].createElement(React__default["default"].Fragment, null, React__default["default"].createElement("div", null, startAt, " ", packageName, " ", command), React__default["default"].createElement(pluridReact.PluridLink, { route: `/log/${id}`, devisible: true, style: { display: 'grid', } }, React__default["default"].createElement(pluridIconsReact.PluridIconInfo // title="details" , { // title="details" atClick: () => { } })), React__default["default"].createElement(pluridIconsReact.PluridIconDelete // title="delete" , { // title="delete" atClick: () => handleLogObliterate(id) }))); }; const createSearchTerms = (logs) => { const searchTerms = logs.map(log => { const { id, package: packageName, command, } = log; const searchTerm = { id, data: [ packageName.toLowerCase(), command.toLowerCase(), id.toLowerCase(), ], }; return searchTerm; }); return searchTerms; }; // #endregion module const LogsView = (properties) => { // #region properties const { // #region required // #region values // #endregion values // #region methods setGeneralView, // #endregion methods // #endregion required // #region state stateGeneralTheme, stateInteractionTheme, stateLogs, // #endregion state // #region dispatch dispatch, dispatchRemoveEntity, // #endregion dispatch } = properties; // #endregion properties // #region handlers const handleLogObliterate = (id) => __awaiter(void 0, void 0, void 0, function* () { try { dispatchRemoveEntity({ type: 'log', id, }); const input = { value: id, }; yield client.mutate({ mutation: OBLITERATE_LOG, variables: { input, }, }); } catch (error) { return; } }); // #endregion handlers // #region state const [searchTerms, setSearchTerms] = React.useState(createSearchTerms(stateLogs)); const [filteredRows, setFilteredRows] = React.useState(stateLogs.map(log => logRowRenderer(log, handleLogObliterate))); // #endregion state // #region handlers const filterUpdate = (rawValue) => { const value = rawValue.toLowerCase(); const filterIDs = getFilterIDs(searchTerms, value); const filteredLogs = stateLogs.filter(stateLog => { if (filterIDs.includes(stateLog.id)) { return true; } return false; }); const sortedLogs = filteredLogs.sort(compareValues('name')); setFilteredRows(sortedLogs.map(log => logRowRenderer(log, handleLogObliterate))); }; // #endregion handlers // #region effects React.useEffect(() => { const searchTerms = createSearchTerms(stateLogs); const filteredRows = stateLogs.map(log => logRowRenderer(log, handleLogObliterate)); setSearchTerms(searchTerms); setFilteredRows(filteredRows); }, [ stateLogs, ]); // #endregion effects // #region render const rowsHeader = (React__default["default"].createElement(React__default["default"].Fragment, null, React__default["default"].createElement("div", null, "log"), React__default["default"].createElement("div", null), React__default["default"].createElement("div", null))); return (React__default["default"].createElement(EntityView, { generalTheme: stateGeneralTheme, interactionTheme: stateInteractionTheme, rowTemplate: "3fr 30px 30px", rowsHeader: rowsHeader, rows: filteredRows, noRows: "no logs", filterUpdate: filterUpdate, refresh: () => { } })); // #endregion render }; const mapStateToProperties$6 = (state) => ({ stateGeneralTheme: selectors.themes.getGeneralTheme(state), stateInteractionTheme: selectors.themes.getInteractionTheme(state), stateLogs: selectors.data.getLogs(state), }); const mapDispatchToProperties$6 = (dispatch) => ({ dispatch, dispatchRemoveEntity: (payload) => dispatch(actions.data.removeEntity(payload)), }); const ConnectedLogsView = reactRedux.connect(mapStateToProperties$6, mapDispatchToProperties$6, null, { context: reduxContext, })(LogsView); // #endregion exports // #region imports const StyledGeneralView = styled__default["default"].div.withConfig({ displayName: "StyledGeneralView", componentId: "-w7gw4x" }) ` display: grid; grid-template-columns: ${({ compactSelectors, }) => compactSelectors ? '60px 4fr' : '1fr 4fr'}; min-height: 700px; `; const StyledGeneralSelectors = styled__default["default"].div.withConfig({ displayName: "StyledGeneralSelectors", componentId: "-11ksfyu" }) ` display: grid; justify-content: space-between; grid-template-columns: 1fr; grid-template-rows: ${({ viewUsageType, }) => { // if (viewUsageType) { // return '100px auto 80px'; // } return '100px auto 40px'; }}; background-color: ${({ theme, }) =>