mirror of
https://github.com/ToolJet/ToolJet
synced 2026-04-21 21:47:17 +00:00
* feat: Folder permission system * fix(group-permissions): resolve custom group validation, folder edit check, and UI inconsistencie * edit folder container && no folder in custom resource * fix the ui for custom in empty state * fix: coercion logic for folder permissions * feat: enhance folder permissions handling in app components * feat: add folder granular permissions handling in user apps permissions * feat: implement granular folder permissions in ability guard and service * feat: improve error handling for folder permissions with specific messages * feat: enhance EnvironmentSelect component to handle disabled state and improve display logic * chore: bump ee submodules * add basic framework to support platform git * feat: Update permission prop to isEditable in BaseManageGranularAccess component * chore: bump ee server submodule * fix: refine folder visibility logic based on user permissions * feat: enhance MultiValue rendering and styling for "All environments" option * fix:Uniqueness-of-data-source * revert folder changes * fix folder imports * feat: allow app lazy loading feat: import all apps of branches * feat: implement folder ownership checks and enhance app permissions handling * fix:ui changes * feat: update WorkspaceGitSyncModal UI * feat: enhance folder permissions handling for app ownership and actions * chore: clarify folder creation and deletion permissions in workspace context * fix: pull commit button & swtich branch visibility * feat: import app from git repo * fix: freezed state * remove reference of activebranchId * fix linting * fix: update folder permission labels * fixed folder permission cases * fixed css class issue * fix: datasource UI * minor fix * feat: streamline folder permissions handling by removing redundant checks and simplifying access logic * refactor: made error message consistent * fix:ui changes and PR fetching on master * fix: datasource and snapshot creation * fix: app rendering and stub loading * fix: add missing permission message for folder deletion action * refactor: consolidate forbidden messages for folder actions and maintain consistency * fix: allow pull into current branch * fix renaming of tags and reload on branch switch * fix: allow branches import from git * fix:push or tab removed * feat: streamline permission handling and improve app visibility logic * fix: remove default access denial message in AbilityGuard * fixed all user page functionality falky case * feat: add workspace-level PR fetch endpoint (returns all repo PRs without app filtering) * fix: remove app_branch_table * Fixed profile flaky case * fixed granular access flaky case * fix: allow branch creation from tags * fix: update default branch creation logic to use provider config * fix: dso and dsv operations on codebase * fix: constants reloading and refetch org git details on data * uniquness per branch * removed comment * fix: update app version handling and add is_stub column for branch-level tracking * fix workspace branch backfilling for scoped branches * added unique constraint - migration * fix: update app version unique constraint to include branchId for branch-aware handling * fix: update subproject commit reference in server/ee * chore: revert package-lock.json * chore: revert frontend/package-lock.json to main * removed banner and changed migration * minor fix * fix: remove unused import and handle UUID parse error gracefully in AppsUtilService * fix: update app stub checks to safely access app_versions * refactor: revert folder operations * fix: removed branch id logic * fix: ds migration * fix encrypted diff logic * fix: update openCreateAppModal to handle workspace branch lock * fix: subscriber filtering, freeze priority, meta hash optimization, and co_relation_id backfill * feat: add script to generate app metadata from app.json files * fix: meta script fix: backfilling of co-realtion-ids * refactor: streamline parameter formatting in workspace git sync adapter methods * Improves data source handling for workspace git sync Fixes workspace git sync to properly recognize data sources across branches by improving correlation ID handling and branch-aware data source version creation. Uses strict equality comparison in deep equal utility to prevent type coercion issues. Excludes credential_id from data source comparison to prevent unnecessary save button states. Removes is_active filter from branch data source queries to include all versions for proper synchronization. * refactor: update branch switching logic and improve error handling for data source creation * fix: migration order * 🚀 chore: update submodules to latest main after auto-merge (#15628) Co-authored-by: gsmithun4 <[email protected]> * chore: update version to 3.21.8-beta across all components * fix:import app from device * fix:ui Edit&launch,folderCopy,branching dropdown in apps and ds * fix:encrypted helper text on master * fix: import from git flow * logs cleanup * fix:migration-datasource-uniqueness * fix: app on pull * chore: update server submodule hash * fix: corelation-id generation and version naming * fix: last versions deletion error fix: no multiple version creation * fix:ui and toast * chore: update server submodule hash * feat: add branch handling for app availability and improve error handling * fix: update encrypted value handling in DynamicForm and improve workspace constant validation logic * fix: improve formatting of help text in DynamicForm and enhance error message for adding constants on master branch * fix: correct version creation and pull in default branch * chore: update server submodule hash fix: remove logs from other PR * fix:data source uniquness at workspace level * fix: update header component logic for path validation and improve version import handling * chore: update server submodule to latest commit * fixed folder modal changes * fix:failed to create a query error inside apps * feat: add branchId support for data source versioning in app import/export service * fix: push & pull of tags and versions * fix: update subproject commit reference in server/ee * fix:removed gitSync logic from module rename * fix:removed switchbranch modal & allowed renaming from masted module&workflow creation * chore: Update server submodule hash * fix: change stub button to edit * refactor/git-sync-remove-modules-workflows * fix:version name for module and workflo w * fix:templet app creation * fix: add author details for branch --------- Co-authored-by: gsmithun4 <[email protected]> Co-authored-by: Pratush <[email protected]> Co-authored-by: Shantanu Mane <[email protected]> Co-authored-by: parthy007 <[email protected]> Co-authored-by: Yukti Goyal <[email protected]> Co-authored-by: Muhsin Shah <[email protected]> Co-authored-by: Adish M <[email protected]> Co-authored-by: gsmithun4 <[email protected]> Co-authored-by: Parth <[email protected]>
254 lines
6.8 KiB
JavaScript
254 lines
6.8 KiB
JavaScript
import config from 'config';
|
|
import { authHeader, handleResponse } from '@/_helpers';
|
|
|
|
export const appVersionService = {
|
|
getAll,
|
|
getOne,
|
|
getAppVersionData,
|
|
create,
|
|
del,
|
|
save,
|
|
promoteEnvironment,
|
|
autoSaveApp,
|
|
saveAppVersionEventHandlers,
|
|
createAppVersionEventHandler,
|
|
bulkCreateAppVersionEventHandlers,
|
|
deleteAppVersionEventHandler,
|
|
clonePage,
|
|
findAllEventsWithSourceId,
|
|
cloneGroup,
|
|
createDraftVersion,
|
|
};
|
|
|
|
function getAll(appId) {
|
|
const requestOptions = { method: 'GET', headers: authHeader(), credentials: 'include' };
|
|
return fetch(`${config.apiUrl}/apps/${appId}/versions`, requestOptions).then(handleResponse);
|
|
}
|
|
|
|
function getOne(appId, versionId) {
|
|
const requestOptions = { method: 'GET', headers: authHeader(), credentials: 'include' };
|
|
return fetch(`${config.apiUrl}/apps/${appId}/versions/${versionId}`, requestOptions).then(handleResponse);
|
|
}
|
|
|
|
function promoteEnvironment(appId, versionId, currentEnvironmentId) {
|
|
const requestOptions = {
|
|
method: 'PUT',
|
|
headers: authHeader(),
|
|
credentials: 'include',
|
|
body: JSON.stringify({ currentEnvironmentId }),
|
|
};
|
|
return fetch(`${config.apiUrl}/v2/apps/${appId}/versions/${versionId}/promote`, requestOptions).then(handleResponse);
|
|
}
|
|
function getAppVersionData(appId, versionId, mode) {
|
|
const requestOptions = { method: 'GET', headers: authHeader(), credentials: 'include' };
|
|
return fetch(`${config.apiUrl}/v2/apps/${appId}/versions/${versionId}?mode=${mode}`, requestOptions).then(
|
|
handleResponse
|
|
);
|
|
}
|
|
|
|
function create(appId, versionName, versionDescription, versionFromId, currentEnvironmentId, versionType = 'version') {
|
|
const body = {
|
|
versionName,
|
|
versionDescription,
|
|
versionFromId,
|
|
environmentId: currentEnvironmentId,
|
|
versionType,
|
|
};
|
|
|
|
const requestOptions = {
|
|
method: 'POST',
|
|
headers: authHeader(),
|
|
credentials: 'include',
|
|
body: JSON.stringify(body),
|
|
};
|
|
return fetch(`${config.apiUrl}/apps/${appId}/versions`, requestOptions).then(handleResponse);
|
|
}
|
|
|
|
function createDraftVersion(appId, versionFromId, environmentId, versionDescription = '') {
|
|
const body = {
|
|
versionFromId,
|
|
environmentId,
|
|
};
|
|
if (versionDescription) {
|
|
body.versionDescription = versionDescription;
|
|
}
|
|
|
|
const requestOptions = {
|
|
method: 'POST',
|
|
headers: authHeader(),
|
|
credentials: 'include',
|
|
body: JSON.stringify(body),
|
|
};
|
|
return fetch(`${config.apiUrl}/apps/${appId}/draft-versions`, requestOptions).then(handleResponse);
|
|
}
|
|
|
|
function del(appId, versionId) {
|
|
const requestOptions = {
|
|
method: 'DELETE',
|
|
headers: authHeader(),
|
|
credentials: 'include',
|
|
};
|
|
return fetch(`${config.apiUrl}/apps/${appId}/versions/${versionId}`, requestOptions).then(handleResponse);
|
|
}
|
|
|
|
function save(appId, versionId, values, isUserSwitchedVersion = false) {
|
|
const body = { is_user_switched_version: isUserSwitchedVersion };
|
|
if (values.definition) body['definition'] = values.definition;
|
|
if (values.name) body['name'] = values.name;
|
|
if (values.diff) body['app_diff'] = values.diff;
|
|
if (values.description !== undefined && values.description !== null) body['description'] = values.description;
|
|
if (values.status) body['status'] = values.status;
|
|
|
|
const requestOptions = {
|
|
method: 'PUT',
|
|
headers: authHeader(),
|
|
credentials: 'include',
|
|
body: JSON.stringify(body),
|
|
};
|
|
return fetch(`${config.apiUrl}/v2/apps/${appId}/versions/${versionId}`, requestOptions).then(handleResponse);
|
|
}
|
|
|
|
function autoSaveApp(
|
|
appId,
|
|
versionId,
|
|
diff,
|
|
type,
|
|
pageId,
|
|
operation,
|
|
isUserSwitchedVersion = false,
|
|
isComponentCutProcess = false
|
|
) {
|
|
const OPERATION = {
|
|
create: 'POST',
|
|
update: 'PUT',
|
|
delete: 'DELETE',
|
|
};
|
|
|
|
const bodyMappings = {
|
|
pages: {
|
|
create: { ...diff },
|
|
delete: { ...diff },
|
|
},
|
|
global_settings: {
|
|
update: { ...diff },
|
|
},
|
|
page_settings: {
|
|
update: { ...diff },
|
|
},
|
|
};
|
|
|
|
const body = !type
|
|
? { ...diff }
|
|
: bodyMappings[type]?.[operation] || {
|
|
is_user_switched_version: isUserSwitchedVersion,
|
|
pageId,
|
|
diff,
|
|
};
|
|
|
|
if (type === 'components' && operation === 'delete' && isComponentCutProcess) {
|
|
body['is_component_cut'] = true;
|
|
}
|
|
|
|
const requestOptions = {
|
|
method: OPERATION[operation],
|
|
headers: authHeader(),
|
|
credentials: 'include',
|
|
body: JSON.stringify(body),
|
|
};
|
|
const url = `${config.apiUrl}/v2/apps/${appId}/versions/${versionId}/${type ?? ''}`;
|
|
|
|
return fetch(url, requestOptions).then(handleResponse);
|
|
}
|
|
|
|
function saveAppVersionEventHandlers(appId, versionId, events, updateType = 'update') {
|
|
const body = {
|
|
events,
|
|
updateType,
|
|
};
|
|
|
|
const requestOptions = {
|
|
method: 'PUT',
|
|
headers: authHeader(),
|
|
credentials: 'include',
|
|
body: JSON.stringify(body),
|
|
};
|
|
return fetch(`${config.apiUrl}/v2/apps/${appId}/versions/${versionId}/events`, requestOptions).then(handleResponse);
|
|
}
|
|
|
|
function createAppVersionEventHandler(appId, versionId, event) {
|
|
const body = {
|
|
...event,
|
|
};
|
|
|
|
const requestOptions = {
|
|
method: 'POST',
|
|
headers: authHeader(),
|
|
credentials: 'include',
|
|
body: JSON.stringify(body),
|
|
};
|
|
return fetch(`${config.apiUrl}/v2/apps/${appId}/versions/${versionId}/events`, requestOptions).then(handleResponse);
|
|
}
|
|
|
|
function bulkCreateAppVersionEventHandlers(appId, versionId, events) {
|
|
const body = {
|
|
events,
|
|
};
|
|
|
|
const requestOptions = {
|
|
method: 'POST',
|
|
headers: authHeader(),
|
|
credentials: 'include',
|
|
body: JSON.stringify(body),
|
|
};
|
|
return fetch(`${config.apiUrl}/v2/apps/${appId}/versions/${versionId}/events/bulk`, requestOptions).then(
|
|
handleResponse
|
|
);
|
|
}
|
|
|
|
function deleteAppVersionEventHandler(appId, versionId, eventId) {
|
|
const requestOptions = {
|
|
method: 'DELETE',
|
|
headers: authHeader(),
|
|
credentials: 'include',
|
|
};
|
|
return fetch(`${config.apiUrl}/v2/apps/${appId}/versions/${versionId}/events/${eventId}`, requestOptions).then(
|
|
handleResponse
|
|
);
|
|
}
|
|
|
|
function clonePage(appId, versionId, pageId) {
|
|
const requestOptions = {
|
|
method: 'POST',
|
|
headers: authHeader(),
|
|
credentials: 'include',
|
|
};
|
|
return fetch(`${config.apiUrl}/v2/apps/${appId}/versions/${versionId}/pages/${pageId}/clone`, requestOptions).then(
|
|
handleResponse
|
|
);
|
|
}
|
|
|
|
function cloneGroup(appId, versionId, pageId) {
|
|
const requestOptions = {
|
|
method: 'POST',
|
|
headers: authHeader(),
|
|
credentials: 'include',
|
|
};
|
|
return fetch(
|
|
`${config.apiUrl}/v2/apps/${appId}/versions/${versionId}/pages/${pageId}/clone-group`,
|
|
requestOptions
|
|
).then(handleResponse);
|
|
}
|
|
|
|
function findAllEventsWithSourceId(appId, versionId, sourceId = undefined) {
|
|
const requestOptions = {
|
|
method: 'GET',
|
|
headers: authHeader(),
|
|
credentials: 'include',
|
|
};
|
|
|
|
return fetch(
|
|
`${config.apiUrl}/v2/apps/${appId}/versions/${versionId}/events${sourceId ? `?sourceId=${sourceId}` : ''}
|
|
`,
|
|
requestOptions
|
|
).then(handleResponse);
|
|
}
|