Skip to content

Next #7

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 4 commits into from
Mar 19, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 7 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
# AdminForth ForeignInlineList Plugin

<img src="https://img.shields.io/badge/License-MIT-blue.svg" alt="License: MIT" /> <img src="https://woodpecker.devforth.io/api/badges/3848/status.svg" alt="Build Status" /> <a href="https://www.npmjs.com/package/@adminforth/foreign-inline-list"> <img src="https://img.shields.io/npm/dt/@adminforth/foreign-inline-list" alt="npm downloads" /></a> <a href="https://www.npmjs.com/package/@adminforth/foreign-inline-list"><img src="https://img.shields.io/npm/v/@adminforth/foreign-inline-list" alt="npm version" /></a> <a href="https://www.npmjs.com/package/@adminforth/foreign-inline-list">

Allows to add an inline list of connected foreign resource records on a adminforth show page.

## For usage, see [AdminForth ForeignInlineList Documentation](https://adminforth.dev/docs/tutorial/Plugins/ForeignInlineList/)
38 changes: 33 additions & 5 deletions custom/InlineList.vue
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,8 @@
<Teleport to="body">
<!-- todo exclude foreign column-->
<Filters
v-if="listResource"
:columns="listResource.columns.filter((c) => c.name !== listResourceRefColumn.name)"
v-if="filterableColumns.length"
:columns="filterableColumns"
v-model:filters="filters"
:columnsMinMax="columnsMinMax"
:show="filtersShow"
Expand Down Expand Up @@ -70,7 +70,7 @@
{{ `${action.label} (${checkboxes.length})` }}
</button>

<RouterLink v-if="listResource?.options?.allowedActions?.create"
<RouterLink v-if="createIsAllowed"
:to="{
name: 'resource-create',
params: { resourceId: listResource.resourceId },
Expand Down Expand Up @@ -129,7 +129,7 @@ import {
IconFilterOutline,
IconPlusOutline,
} from '@iconify-prerendered/vue-flowbite';
import { showErrorTost } from '@/composables/useFrontendApi';
import { showErrorTost, showWarningTost } from '@/composables/useFrontendApi';
import { getIcon } from '@/utils';

const props = defineProps(['column', 'record', 'meta', 'resource', 'adminUser']);
Expand All @@ -153,13 +153,25 @@ const listResourceRefColumn = computed(() => {
if (!listResource.value) {
return null;
}
return listResource.value.columns.find(c => c.foreignResource?.resourceId === props.resource.resourceId);
return listResource.value.columns.find(c => c.foreignResource?.polymorphicResources
? c.foreignResource.polymorphicResources.find((pr) => pr.resourceId === props.resource.resourceId)
: c.foreignResource?.resourceId === props.resource.resourceId);
});

const selfPrimaryKeyColumn = computed(() => {
return props.resource.columns.find(c => c.primaryKey);
});

const filterableColumns = computed(() => {
if (!listResource.value) {
return [];
}

const refColumn = listResourceRefColumn.value;
return listResource.value.columns.filter((c) => c.name !== refColumn.name
&& (refColumn.foreignResource.polymorphicOn ? c.name !== refColumn.foreignResource.polymorphicOn : true));
});

const endFilters = computed(() => {
if (!listResource.value) {
return [];
Expand All @@ -183,6 +195,17 @@ const endFilters = computed(() => {
];
});

const createIsAllowed = computed(() => {
if (!listResource.value?.options?.allowedActions?.create) {
return false;
}

if (listResourceRefColumn.value && !listResourceRefColumn.value.showIn.create) {
return false;
}
return true;
});

watch([page], async () => {
await getList();
});
Expand Down Expand Up @@ -277,6 +300,11 @@ onMounted( async () => {
method: 'POST',
body: {},
})).resource;

if (listResource.value?.options?.allowedActions?.create && listResourceRefColumn.value && !listResourceRefColumn.value.showIn.create) {
showWarningTost(`Resource '${listResource.value.resourceId}' column '${listResourceRefColumn.value.name}' should be editable on create page for 'create' action to be enabled`, 10000);
}

columnsMinMax.value = await callAdminForthApi({
path: '/get_min_max_for_columns',
method: 'POST',
Expand Down
1 change: 1 addition & 0 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
"main": "dist/index.js",
"types": "dist/index.d.ts",
"type": "module",
"homepage": "https://adminforth.dev/docs/tutorial/Plugins/ForeignInlineList/",
"scripts": {
"build": "tsc && rsync -av --exclude 'node_modules' custom dist/",
"prepare": "npm link adminforth"
Expand Down