Skip to content
On this page

Status Decorator

Add label, and show error, success and info messages for components (dynamic components)

Child Components

Usage

Import

ts
import { Asd } from "@agufaui/${framework name}";

Html

<asd /> or <Asd />

Configuration

Theme component name: asd

Showcase

  • v is component name, eg. v="button" stands for Abutton, v="input" stands for Ainput. Just any AgufaUI component name without first character A
  • component interface definition must extends IProps interface IASdProps<T extends IProps>
  • because of fall through attributes, properties of Asd is renamed to includes characters asd, so v becomes vasd, to differ from dynamic component's v property
*
Can't contain special characters
Must be at least 8 characters
*
http://
*
kg
*
Can't contain special characters
Must be at least 8 characters
Success
Submitted
Responsive
*
Can't contain special characters
Must be at least 8 characters
Click to see code
vue
<template>
	<div class="flex flex-col gap-y-4">
		<asd
			:labelasd="label"
			vasd="input"
			t="grid4"
			dirasd="input"
			:propsasd="props"
			:alertasd="alert"
			:alerterrorasd="alertError"
			@update:v="notify($event)"
		/>
		<asd
			:labelasd="labelPre"
			:prependasd="badgePre"
			vasd="input"
			t="grid4"
			dirasd="input"
			:propsasd="propsPre"
		/>
		<asd
			:labelasd="labelPost"
			:postpendasd="badgePost"
			vasd="select"
			t="grid4"
			dirasd="select"
			:propsasd="select"
			@select="assign(select.v, $event)"
		/>
		<asd
			:labelasd="labelUp"
			uplabelasd
			vasd="input"
			t="grid4"
			dirasd="input"
			:propsasd="props"
			:alertasd="alert"
			:alerterrorasd="alertError"
			@update:v="notify($event)"
		/>
		<asd vasd="button" dirasd="button" :propsasd="propsButton" :alerterrorasd="alertErrorSuccess" />
		<asd vasd="button" dirasd="button" :propsasd="propsSlot" :alerterrorasd="alertErrorSuccess">
			<template #msg>
				<span>Submitted</span>
			</template>
		</asd>
		<b>Responsive</b>
		<asd
			:labelasd="labelRes"
			vasd="input"
			t="resgrid4"
			dirasd="input"
			:propsasd="props"
			:alertasd="alert"
			:alerterrorasd="alertError"
			@update:v="notify($event)"
		/>
	</div>
</template>

<script lang="ts">
export default {
	name: "DocSd",
};
</script>

<script setup lang="ts">
import type {
	IAInputProps,
	IAButtonProps,
	IALabelProps,
	IAAlertProps,
	IAAlertErrorProps,
	IABadgeProps,
	IASelectProps,
	TSelectOption,
} from "@agufaui/theme";

let label: IALabelProps = {
	v: "Username",
	c: "pr-2",
	required: true,
	right: true,
	tooltip: { v: "user name" },
};

let props: IAInputProps = {
	v: "",
	vc: "w-full",
};

let alert: IAAlertProps = {
	v: "Can't contain special characters",
	show: true,
};

let alertError: IAAlertErrorProps = {
	v: "Must be at least 8 characters",
	show: true,
	error: true,
};

let labelPre: IALabelProps = {
	v: "Url",
	c: "pr-2",
	required: true,
	right: true,
	tooltip: { v: "url" },
};

let propsPre: IAInputProps = {
	v: "",
	vc: "w-full !rounded-none !rounded-r-lg",
};

let badgePre: IABadgeProps = {
	v: "http://",
	t: "pre",
};

let labelPost: IALabelProps = {
	v: "Weight",
	c: "pr-2",
	required: true,
	right: true,
	tooltip: { v: "weight" },
};

const options: TSelectOption[] = [
	{
		id: "50",
		name: "50",
	},
	{
		id: "100",
		name: "100",
	},
	{
		id: "200",
		name: "200",
	},
];

let select: IASelectProps = {
	v: { id: "", name: "" },
	options: options,
	fullwidth: true,
	c: "!w-5rem",
	buttonc: "!rounded-none !rounded-l-lg",
};

let badgePost: IABadgeProps = {
	v: "kg",
	t: "post",
	c: "mb-0.6",
};

let labelUp: IALabelProps = {
	v: "Username",
	c: "pr-2",
	required: true,
	tooltip: { v: "user name" },
};

let propsButton = reactive<IAButtonProps>({
	v: "Submit",
	t: "focusblock",
	c: "text-white bg-sky-5 hover:bg-sky-6 focus:ring-sky-5",
});
let alertErrorSuccess: IAAlertErrorProps = {
	v: "Success",
	show: true,
	c: "w-full",
};

let propsSlot = reactive<IAButtonProps>({
	v: "Slot",
	t: "focusblock",
	c: "text-white bg-sky-5 hover:bg-sky-6 focus:ring-sky-5",
});

let labelRes: IALabelProps = {
	v: "Username",
	c: "pr-2",
	required: true,
	tooltip: { v: "user name" },
};

function notify(e: string) {
	props.v = e;
	console.log(props.v);
}

const assign = (obj: TSelectOption, updateObj: TSelectOption) => {
	Object.assign(obj, updateObj);
	if (!updateObj.display) {
		delete obj.display;
	}
};
</script>

Slot

  • One default slot for your own markups/components replacing dynamic AgufaUI component
  • One named slot info for info message
  • One named slot msg for error and success message
  • One named slot pre for your own markups/components replacing prepend Abadge component
  • One named slot post for your own markups/components replacing postpend Abadge component

AgufaUI provided Theme

CDefaultType is just string constant "default"

ts
import { CDefaultType, CUseType } from "@agufaui/config";
import type { IASdProps } from "../../types/form/ASd";

export const DASdDefault = {
	labelgridasdc: "grid grid-cols-3",
	labelgridspanasdc: "col-span-2",
};

export const DASdGrid4 = {
	[CUseType]: CDefaultType,
	labelgridasdc: "d@grid-cols-3 grid-cols-4",
	labelgridspanasdc: "d@col-span-2 col-span-3",
};

export const DASdResponsive = {
	labelgridasdc: "grid sm:grid-cols-3",
	labelgridspanasdc: "sm:col-span-2",
	labelc: "justify-start sm:justify-end",
};

export const DASdResponsiveGrid4 = {
	[CUseType]: "res",
	labelgridasdc: "d@sm:grid-cols-3 sm:grid-cols-4",
	labelgridspanasdc: "d@sm:col-span-2 sm:col-span-3",
};

export const DASd: Readonly<Record<string, Partial<IASdProps<any>>>> = {
	[CDefaultType]: DASdDefault,
	grid4: DASdGrid4,
	res: DASdResponsive,
	resgrid4: DASdResponsiveGrid4,
};

Attributes (Properties)

Default Values

vue
spacey: "space-y-1",

Unique

ts
export interface IASdProps<T extends IProps> extends IProps, IPropsComposeY {
	labelasd?: IALabelProps; // label
	labelgridasdc?: string; // if there is a label, display grid
	labelgridspanasdc?: string; // if there is a label, dynamic component span how many columns of a grid
	uplabelasd?: boolean; // if label position at top of control
	labelc?: string; // css classes for label
	componentc?: string; // css classes for component container 'div' html element
	vasd?: string; // component name (eg. button stands for Abutton).  Not configurable
	dirasd?: string; // component file dir (eg. button for Abutton)
	propsasd?: T; // component props
	attrsasd?: Record<string, any>; // html element attributes, eg. for 'a' tag, 'target' attribute
	errorasd?: boolean; // if there is error
	prependasd?: IABadgeProps; // prepend to dynamic component
	postpendasd?: IABadgeProps; // postpend to dynamic component
	infoc?: string; // css classes for info message `aalert` child component
	alertasd?: IAAlertProps;
	msgc?: string; // css classes for error or success message `aalertError` child component
	alerterrorasd?: IAAlertErrorProps;
}

Inherit from IProps

ts
export interface IProps {
	t?: string; // user defined or AgufaUI provided component type.  Not configurable
	c?: string; // css classes for component root html element
}

Inherit from IPropsComposeY

ts
// #region iprops
export interface IProps {
	t?: string; // user defined or AgufaUI provided component type.  Not configurable
	c?: string; // css classes for component root html element
}
// #endregion iprops

// #region ipropscomposex
export interface IPropsComposeX {
	spacex?: string; // space between elements in x-axis eg. space-x-1.5
}
// #endregion ipropscomposex

// #region ipropscomposey;

export interface IPropsComposeY {
	spacey?: string; // space between elements in y-axis eg. space-y-1.5
}
// #endregion ipropscomposey;

// #region ipropsform
export interface IPropsForm {
	disabled?: boolean; // disabled
}
// #endregion ipropsform

// #region ipropsicon
export type TLRPosition = "left" | "right";

export interface IPropsIcon {
	i?: string; // icon eg. i-eos-icons:loading
	ipos?: TLRPosition; // icon position
	ic?: string; // css classes for icon element
}
// #endregion ipropsicon

// #region ipropsloading
export interface IPropsLoading extends IPropsIcon {
	loading?: boolean; // loading
}
// #endregion ipropsloading

Released under the MIT License.