(refactor): image sharp upgrade and dummy image generator created
This commit is contained in:
parent
cdaabb4cd3
commit
5ad87b6d48
@ -1,2 +1,35 @@
|
|||||||
BROWSER=none
|
BROWSER=none
|
||||||
REACT_APP_SITEID=404c8232-9048-4519-bfba-6e78dc7005ca
|
|
||||||
|
REACT_APP_API=https://localhost:7151/api
|
||||||
|
REACT_APP_SITEID=404c8232-9048-4519-bfba-6e78dc7005ca
|
||||||
|
|
||||||
|
REACT_APP_ACCOUNT=Account
|
||||||
|
|
||||||
|
REACT_APP_BLOGITEM=BlogItem
|
||||||
|
REACT_APP_BLOGITEMS=BlogItems
|
||||||
|
|
||||||
|
REACT_APP_BLOGITEMS_FEAUTERED=BlogItems/Featured
|
||||||
|
|
||||||
|
REACT_APP_CATEGORYITEM=CategoryItem
|
||||||
|
REACT_APP_CATEGORYITEMS=CategoryItems
|
||||||
|
|
||||||
|
REACT_APP_CONTENT=Content
|
||||||
|
|
||||||
|
REACT_APP_DKIM=Dkim
|
||||||
|
|
||||||
|
REACT_APP_IMAGE=Image
|
||||||
|
REACT_APP_IMAGES=Images
|
||||||
|
|
||||||
|
REACT_APP_INITIALIZATION=Initialization
|
||||||
|
|
||||||
|
REACT_APP_SHOPCARTITEM=ShopCartItem
|
||||||
|
REACT_APP_SHOPCARTITEMS=ShopCartItems
|
||||||
|
|
||||||
|
REACT_APP_SHOPITEM=ShopItem
|
||||||
|
REACT_APP_SHOPITEMS=ShopItems
|
||||||
|
|
||||||
|
REACT_APP_TEMPLATE=Template
|
||||||
|
|
||||||
|
REACT_APP_UTILS=Utils
|
||||||
|
|
||||||
|
REACT_APP_WeatherForecast=WeatherForecast
|
||||||
@ -37,6 +37,67 @@
|
|||||||
<DependentUpon>Dockerfile</DependentUpon>
|
<DependentUpon>Dockerfile</DependentUpon>
|
||||||
</Content>
|
</Content>
|
||||||
<None Include="Dockerfile" />
|
<None Include="Dockerfile" />
|
||||||
|
<Content Include="src\components\FeatherIcons\icons.json" />
|
||||||
|
<Content Include="src\components\Loader\scss\animations\ball-beat.scss" />
|
||||||
|
<Content Include="src\components\Loader\scss\animations\ball-clip-rotate-multiple.scss" />
|
||||||
|
<Content Include="src\components\Loader\scss\animations\ball-clip-rotate-pulse.scss" />
|
||||||
|
<Content Include="src\components\Loader\scss\animations\ball-clip-rotate.scss" />
|
||||||
|
<Content Include="src\components\Loader\scss\animations\ball-grid-beat.scss" />
|
||||||
|
<Content Include="src\components\Loader\scss\animations\ball-grid-pulse.scss" />
|
||||||
|
<Content Include="src\components\Loader\scss\animations\ball-pulse-rise.scss" />
|
||||||
|
<Content Include="src\components\Loader\scss\animations\ball-pulse-round.scss" />
|
||||||
|
<Content Include="src\components\Loader\scss\animations\ball-pulse-sync.scss" />
|
||||||
|
<Content Include="src\components\Loader\scss\animations\ball-pulse.scss" />
|
||||||
|
<Content Include="src\components\Loader\scss\animations\ball-rotate.scss" />
|
||||||
|
<Content Include="src\components\Loader\scss\animations\ball-scale-multiple.scss" />
|
||||||
|
<Content Include="src\components\Loader\scss\animations\ball-scale-random.scss" />
|
||||||
|
<Content Include="src\components\Loader\scss\animations\ball-scale-ripple-multiple.scss" />
|
||||||
|
<Content Include="src\components\Loader\scss\animations\ball-scale-ripple.scss" />
|
||||||
|
<Content Include="src\components\Loader\scss\animations\ball-scale.scss" />
|
||||||
|
<Content Include="src\components\Loader\scss\animations\ball-spin-fade-loader.scss" />
|
||||||
|
<Content Include="src\components\Loader\scss\animations\ball-spin-loader.scss" />
|
||||||
|
<Content Include="src\components\Loader\scss\animations\ball-triangle-path.scss" />
|
||||||
|
<Content Include="src\components\Loader\scss\animations\ball-zig-zag-deflect.scss" />
|
||||||
|
<Content Include="src\components\Loader\scss\animations\ball-zig-zag.scss" />
|
||||||
|
<Content Include="src\components\Loader\scss\animations\cube-transition.scss" />
|
||||||
|
<Content Include="src\components\Loader\scss\animations\line-scale-pulse-out-rapid.scss" />
|
||||||
|
<Content Include="src\components\Loader\scss\animations\line-scale-pulse-out.scss" />
|
||||||
|
<Content Include="src\components\Loader\scss\animations\line-scale-random.scss" />
|
||||||
|
<Content Include="src\components\Loader\scss\animations\line-scale.scss" />
|
||||||
|
<Content Include="src\components\Loader\scss\animations\line-spin-fade-loader.scss" />
|
||||||
|
<Content Include="src\components\Loader\scss\animations\pacman.scss" />
|
||||||
|
<Content Include="src\components\Loader\scss\animations\semi-circle-spin.scss" />
|
||||||
|
<Content Include="src\components\Loader\scss\animations\square-spin.scss" />
|
||||||
|
<Content Include="src\components\Loader\scss\animations\triangle-skew-spin.scss" />
|
||||||
|
<Content Include="src\components\Loader\scss\demo\demo.css" />
|
||||||
|
<Content Include="src\components\Loader\scss\demo\demo.html" />
|
||||||
|
<Content Include="src\components\Loader\scss\demo\src\demo.jade" />
|
||||||
|
<Content Include="src\components\Loader\scss\demo\src\demo.scss" />
|
||||||
|
<Content Include="src\components\Loader\scss\loaders.scss" />
|
||||||
|
<Content Include="src\components\Loader\scss\README.md" />
|
||||||
|
<Content Include="src\components\Loader\scss\_functions.scss" />
|
||||||
|
<Content Include="src\components\Loader\scss\_mixins.scss" />
|
||||||
|
<Content Include="src\components\Loader\scss\_variables.scss" />
|
||||||
|
<Content Include="src\components\ReactFastCompare\index.js" />
|
||||||
|
<Content Include="src\components\ReactFastCompare\LICENSE" />
|
||||||
|
<Content Include="src\components\ReactFastCompare\README.md" />
|
||||||
|
<Content Include="src\components\ReactHelmet\HelmetConstants.js" />
|
||||||
|
<Content Include="src\components\ReactHelmet\HelmetUtils.js" />
|
||||||
|
<Content Include="src\components\ReactHelmet\index.js" />
|
||||||
|
<Content Include="src\components\ReactHelmet\LICENSE" />
|
||||||
|
<Content Include="src\components\ReactHelmet\README.md" />
|
||||||
|
<Content Include="src\components\ReactSideEffect\index.js" />
|
||||||
|
<Content Include="src\components\ReactSideEffect\LICENSE" />
|
||||||
|
<Content Include="src\components\ReactSideEffect\README.md" />
|
||||||
|
<Content Include="src\layouts\admin\scss\style.module.scss" />
|
||||||
|
<Content Include="src\layouts\admin\SideMenu\scss\style.module.scss" />
|
||||||
|
<Content Include="src\layouts\public\scss\style.module.scss" />
|
||||||
|
<Content Include="src\layouts\scss\style.scss" />
|
||||||
|
<Content Include="src\pages\Home\scss\style.module.scss" />
|
||||||
|
<Content Include="src\pages\Shop\Cart\scss\style.module.scss" />
|
||||||
|
<Content Include="src\pages\Shop\Checkout\scss\style.module.scss" />
|
||||||
|
<Content Include="src\pages\Signin\scss\style.scss" />
|
||||||
|
<Content Include="src\pages\Signup\scss\style.scss" />
|
||||||
<Content Include="tsconfig.json" />
|
<Content Include="tsconfig.json" />
|
||||||
<Content Include="package.json" />
|
<Content Include="package.json" />
|
||||||
<Content Include="README.md" />
|
<Content Include="README.md" />
|
||||||
@ -44,19 +105,135 @@
|
|||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<Folder Include="src\" />
|
<Folder Include="src\" />
|
||||||
<Folder Include="src\components\" />
|
<Folder Include="src\components\" />
|
||||||
|
<Folder Include="src\components\Comments\" />
|
||||||
|
<Folder Include="src\components\FeatherIcons\" />
|
||||||
|
<Folder Include="src\components\FeatherRating\" />
|
||||||
|
<Folder Include="src\components\Loader\" />
|
||||||
|
<Folder Include="src\components\Loader\scss\" />
|
||||||
|
<Folder Include="src\components\Loader\scss\animations\" />
|
||||||
|
<Folder Include="src\components\Loader\scss\demo\" />
|
||||||
|
<Folder Include="src\components\Loader\scss\demo\src\" />
|
||||||
|
<Folder Include="src\components\Pagination\" />
|
||||||
|
<Folder Include="src\components\ReactFastCompare\" />
|
||||||
|
<Folder Include="src\components\ReactHelmet\" />
|
||||||
|
<Folder Include="src\components\ReactSideEffect\" />
|
||||||
|
<Folder Include="src\components\SideWidgets\" />
|
||||||
|
<Folder Include="src\enumerations\" />
|
||||||
<Folder Include="src\functions\" />
|
<Folder Include="src\functions\" />
|
||||||
|
<Folder Include="src\functions\jwtDecode\" />
|
||||||
<Folder Include="src\layouts\" />
|
<Folder Include="src\layouts\" />
|
||||||
|
<Folder Include="src\layouts\admin\" />
|
||||||
|
<Folder Include="src\layouts\admin\NavMenu\" />
|
||||||
|
<Folder Include="src\layouts\admin\scss\" />
|
||||||
|
<Folder Include="src\layouts\admin\SideMenu\" />
|
||||||
|
<Folder Include="src\layouts\admin\SideMenu\scss\" />
|
||||||
|
<Folder Include="src\layouts\public\" />
|
||||||
|
<Folder Include="src\layouts\public\Footer\" />
|
||||||
|
<Folder Include="src\layouts\public\NavMenu\" />
|
||||||
|
<Folder Include="src\layouts\public\scss\" />
|
||||||
|
<Folder Include="src\layouts\scss\" />
|
||||||
<Folder Include="src\models\" />
|
<Folder Include="src\models\" />
|
||||||
<Folder Include="src\pages\" />
|
<Folder Include="src\pages\" />
|
||||||
|
<Folder Include="src\pages\Blog\" />
|
||||||
|
<Folder Include="src\pages\Blog\Catalog\" />
|
||||||
|
<Folder Include="src\pages\Blog\Catalog\scss\" />
|
||||||
|
<Folder Include="src\pages\Blog\Item\" />
|
||||||
|
<Folder Include="src\pages\Home\" />
|
||||||
|
<Folder Include="src\pages\Home\scss\" />
|
||||||
|
<Folder Include="src\pages\Profile\" />
|
||||||
|
<Folder Include="src\pages\Shop\" />
|
||||||
|
<Folder Include="src\pages\Shop\Cart\" />
|
||||||
|
<Folder Include="src\pages\Shop\Cart\scss\" />
|
||||||
|
<Folder Include="src\pages\Shop\Catalog\" />
|
||||||
|
<Folder Include="src\pages\Shop\Catalog\scss\" />
|
||||||
|
<Folder Include="src\pages\Shop\Checkout\" />
|
||||||
|
<Folder Include="src\pages\Shop\Checkout\scss\" />
|
||||||
|
<Folder Include="src\pages\Shop\Item\" />
|
||||||
|
<Folder Include="src\pages\Shop\RelatedProducts\" />
|
||||||
|
<Folder Include="src\pages\Signin\" />
|
||||||
|
<Folder Include="src\pages\Signin\scss\" />
|
||||||
|
<Folder Include="src\pages\Signup\" />
|
||||||
|
<Folder Include="src\pages\Signup\scss\" />
|
||||||
<Folder Include="src\store\" />
|
<Folder Include="src\store\" />
|
||||||
|
<Folder Include="src\store\reducers\" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<TypeScriptCompile Include="src\App.test.tsx" />
|
<TypeScriptCompile Include="src\App.test.tsx" />
|
||||||
<TypeScriptCompile Include="src\App.tsx" />
|
<TypeScriptCompile Include="src\App.tsx" />
|
||||||
|
<TypeScriptCompile Include="src\components\Comments\index.tsx" />
|
||||||
|
<TypeScriptCompile Include="src\components\FeatherIcons\FeatherIcon.tsx" />
|
||||||
|
<TypeScriptCompile Include="src\components\FeatherIcons\IconInner.tsx" />
|
||||||
|
<TypeScriptCompile Include="src\components\FeatherIcons\index.tsx" />
|
||||||
|
<TypeScriptCompile Include="src\components\FeatherRating\index.tsx" />
|
||||||
|
<TypeScriptCompile Include="src\components\FeatherRating\interfaces.ts" />
|
||||||
|
<TypeScriptCompile Include="src\components\Loader\index.tsx" />
|
||||||
|
<TypeScriptCompile Include="src\components\Pagination\index.tsx" />
|
||||||
|
<TypeScriptCompile Include="src\components\Pagination\utils.ts" />
|
||||||
|
<TypeScriptCompile Include="src\components\ReactHelmet\Types.ts" />
|
||||||
|
<TypeScriptCompile Include="src\components\SideWidgets\Categories.tsx" />
|
||||||
|
<TypeScriptCompile Include="src\components\SideWidgets\Empty.tsx" />
|
||||||
|
<TypeScriptCompile Include="src\components\SideWidgets\index.tsx" />
|
||||||
|
<TypeScriptCompile Include="src\components\SideWidgets\Search.tsx" />
|
||||||
|
<TypeScriptCompile Include="src\enumerations\index.ts" />
|
||||||
|
<TypeScriptCompile Include="src\functions\dateTimeFormat.ts" />
|
||||||
|
<TypeScriptCompile Include="src\functions\findRoutes.ts" />
|
||||||
|
<TypeScriptCompile Include="src\functions\getKeyValue.ts" />
|
||||||
|
<TypeScriptCompile Include="src\functions\index.ts" />
|
||||||
|
<TypeScriptCompile Include="src\functions\jwtDecode\atob.ts" />
|
||||||
|
<TypeScriptCompile Include="src\functions\jwtDecode\base64_url_decode.ts" />
|
||||||
|
<TypeScriptCompile Include="src\functions\jwtDecode\index.ts" />
|
||||||
<TypeScriptCompile Include="src\index.tsx" />
|
<TypeScriptCompile Include="src\index.tsx" />
|
||||||
|
<TypeScriptCompile Include="src\layouts\admin\index.tsx" />
|
||||||
|
<TypeScriptCompile Include="src\layouts\admin\NavMenu\index.tsx" />
|
||||||
|
<TypeScriptCompile Include="src\layouts\admin\SideMenu\index.tsx" />
|
||||||
|
<TypeScriptCompile Include="src\layouts\index.tsx" />
|
||||||
|
<TypeScriptCompile Include="src\layouts\interfaces.tsx" />
|
||||||
|
<TypeScriptCompile Include="src\layouts\public\Footer\index.tsx" />
|
||||||
|
<TypeScriptCompile Include="src\layouts\public\index.tsx" />
|
||||||
|
<TypeScriptCompile Include="src\layouts\public\NavMenu\index.tsx" />
|
||||||
|
<TypeScriptCompile Include="src\models\abstractions.ts" />
|
||||||
|
<TypeScriptCompile Include="src\models\index.ts" />
|
||||||
|
<TypeScriptCompile Include="src\models\pages.ts" />
|
||||||
|
<TypeScriptCompile Include="src\models\pageSections.ts" />
|
||||||
|
<TypeScriptCompile Include="src\models\requests.ts" />
|
||||||
|
<TypeScriptCompile Include="src\models\responses.ts" />
|
||||||
|
<TypeScriptCompile Include="src\pages\AdminHome.tsx" />
|
||||||
|
<TypeScriptCompile Include="src\pages\Blog\Catalog\index.tsx" />
|
||||||
|
<TypeScriptCompile Include="src\pages\Blog\index.ts" />
|
||||||
|
<TypeScriptCompile Include="src\pages\Blog\Item\index.tsx" />
|
||||||
|
<TypeScriptCompile Include="src\pages\Counter.tsx" />
|
||||||
|
<TypeScriptCompile Include="src\pages\FetchData.tsx" />
|
||||||
|
<TypeScriptCompile Include="src\pages\Home\index.tsx" />
|
||||||
|
<TypeScriptCompile Include="src\pages\index.tsx" />
|
||||||
|
<TypeScriptCompile Include="src\pages\Profile\index.tsx" />
|
||||||
|
<TypeScriptCompile Include="src\pages\Shop\Cart\index.tsx" />
|
||||||
|
<TypeScriptCompile Include="src\pages\Shop\Catalog\index.tsx" />
|
||||||
|
<TypeScriptCompile Include="src\pages\Shop\Checkout\index.tsx" />
|
||||||
|
<TypeScriptCompile Include="src\pages\Shop\index.ts" />
|
||||||
|
<TypeScriptCompile Include="src\pages\Shop\Item\index.tsx" />
|
||||||
|
<TypeScriptCompile Include="src\pages\Shop\RelatedProducts\index.tsx" />
|
||||||
|
<TypeScriptCompile Include="src\pages\Signin\index.tsx" />
|
||||||
|
<TypeScriptCompile Include="src\pages\Signup\index.tsx" />
|
||||||
<TypeScriptCompile Include="src\react-app-env.d.ts" />
|
<TypeScriptCompile Include="src\react-app-env.d.ts" />
|
||||||
<TypeScriptCompile Include="src\registerServiceWorker.ts" />
|
<TypeScriptCompile Include="src\registerServiceWorker.ts" />
|
||||||
<TypeScriptCompile Include="src\restClient.ts" />
|
<TypeScriptCompile Include="src\restClient.ts" />
|
||||||
|
<TypeScriptCompile Include="src\store\configureStore.ts" />
|
||||||
|
<TypeScriptCompile Include="src\store\index.ts" />
|
||||||
|
<TypeScriptCompile Include="src\store\reducers\BlogCatalog.ts" />
|
||||||
|
<TypeScriptCompile Include="src\store\reducers\BlogCategories.ts" />
|
||||||
|
<TypeScriptCompile Include="src\store\reducers\BlogFeatured.ts" />
|
||||||
|
<TypeScriptCompile Include="src\store\reducers\BlogItem.ts" />
|
||||||
|
<TypeScriptCompile Include="src\store\reducers\Content.ts" />
|
||||||
|
<TypeScriptCompile Include="src\store\reducers\Counter.ts" />
|
||||||
|
<TypeScriptCompile Include="src\store\reducers\Header.ts" />
|
||||||
|
<TypeScriptCompile Include="src\store\reducers\Loader.ts" />
|
||||||
|
<TypeScriptCompile Include="src\store\reducers\ShopCart.ts" />
|
||||||
|
<TypeScriptCompile Include="src\store\reducers\ShopCatalog.ts" />
|
||||||
|
<TypeScriptCompile Include="src\store\reducers\ShopCategories.ts" />
|
||||||
|
<TypeScriptCompile Include="src\store\reducers\ShopFeatured.ts" />
|
||||||
|
<TypeScriptCompile Include="src\store\reducers\ShopItem.ts" />
|
||||||
|
<TypeScriptCompile Include="src\store\reducers\ShopRelated.ts" />
|
||||||
|
<TypeScriptCompile Include="src\store\reducers\WeatherForecasts.ts" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<Import Project="$(VSToolsPath)\Node.js Tools\Microsoft.NodejsToolsV2.targets" />
|
<Import Project="$(VSToolsPath)\Node.js Tools\Microsoft.NodejsToolsV2.targets" />
|
||||||
<ProjectExtensions>
|
<ProjectExtensions>
|
||||||
|
|||||||
@ -1,21 +1,19 @@
|
|||||||
#Depending on the operating system of the host machines(s) that will build or run the containers, the image specified in the FROM statement may need to be changed.
|
# ==== CONFIGURE =====
|
||||||
#For more information, please see https://aka.ms/containercompat
|
# Use a Node 16 base image
|
||||||
|
FROM node:16-alpine
|
||||||
FROM node:16 AS base
|
# Set the working directory to /app inside the container
|
||||||
WORKDIR /app
|
WORKDIR /app
|
||||||
EXPOSE 80
|
# Copy app files
|
||||||
EXPOSE 443
|
|
||||||
|
|
||||||
FROM node:16 AS build
|
|
||||||
WORKDIR /src
|
|
||||||
COPY ["ClientApp/package.json", "ClientApp/"]
|
|
||||||
WORKDIR "/src/ClientApp"
|
|
||||||
COPY . .
|
COPY . .
|
||||||
RUN npm install
|
# ==== BUILD =====
|
||||||
RUN npm install --location=global react-scripts
|
# Install dependencies (npm ci makes sure the exact versions in the lockfile gets installed)
|
||||||
|
RUN npm ci
|
||||||
#FROM base AS final
|
# Build the app
|
||||||
#WORKDIR "/src/ClientApp"
|
RUN npm run build
|
||||||
#COPY --from=build /app/publish .
|
# ==== RUN =======
|
||||||
|
# Set the env to "production"
|
||||||
ENTRYPOINT ["npm", "run", "start"]
|
ENV NODE_ENV production
|
||||||
|
# Expose the port on which the app will be running (3000 is the default that `serve` uses)
|
||||||
|
EXPOSE 3000
|
||||||
|
# Start the app
|
||||||
|
CMD [ "npx", "serve", "build" ]
|
||||||
@ -45,7 +45,7 @@ const App = () => {
|
|||||||
const { content, header, loader } = useSelector((state: ApplicationState) => state)
|
const { content, header, loader } = useSelector((state: ApplicationState) => state)
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
dispatch(settingsActionCreators.requestContent({ searchParams: { locale: "en-US" }}))
|
dispatch(settingsActionCreators.requestContent())
|
||||||
}, [])
|
}, [])
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
|
|||||||
@ -49,7 +49,7 @@ const FeaturedBlogSection: FC<FeaturedBlog> = ({
|
|||||||
badges: [],
|
badges: [],
|
||||||
|
|
||||||
image: {
|
image: {
|
||||||
src: "https://dummyimage.com/850x350/dee2e6/6c757d.jpg",
|
src: `${process.env.REACT_APP_API}/Image/850x350/dee2e6/6c757d`,
|
||||||
alt: "..."
|
alt: "..."
|
||||||
},
|
},
|
||||||
title: "",
|
title: "",
|
||||||
@ -58,7 +58,7 @@ const FeaturedBlogSection: FC<FeaturedBlog> = ({
|
|||||||
id: "",
|
id: "",
|
||||||
nickName: "",
|
nickName: "",
|
||||||
image: {
|
image: {
|
||||||
src: "https://dummyimage.com/40x40/ced4da/6c757d",
|
src: `${process.env.REACT_APP_API}/Image/40x40/ced4da/6c757d`,
|
||||||
alt: "..."
|
alt: "..."
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|||||||
@ -44,7 +44,7 @@ const TitleSection : FC<TitleSectionModel> = ({
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</Col>
|
</Col>
|
||||||
<div className="col-xl-5 col-xxl-6 d-none d-xl-block text-center"><img className="img-fluid rounded-3 my-5" src="https://dummyimage.com/600x400/343a40/6c757d" alt="..." /></div>
|
<div className="col-xl-5 col-xxl-6 d-none d-xl-block text-center"><img className="img-fluid rounded-3 my-5" src={`${process.env.REACT_APP_API}/Image/600x400/343a40/6c757d`} alt="..." /></div>
|
||||||
</Row>
|
</Row>
|
||||||
</Container>
|
</Container>
|
||||||
</header>
|
</header>
|
||||||
|
|||||||
@ -105,7 +105,7 @@ const Cart = () => {
|
|||||||
<td data-th="Product">
|
<td data-th="Product">
|
||||||
<div className="row">
|
<div className="row">
|
||||||
<div className="col-md-3 text-left">
|
<div className="col-md-3 text-left">
|
||||||
<img src="https://dummyimage.com/250x250/ced4da/6c757d.jpg" alt="" className="img-fluid d-none d-md-block rounded mb-2 shadow" />
|
<img src={`${process.env.REACT_APP_API}/Image/250x250/ced4da/6c757d`} alt="" className="img-fluid d-none d-md-block rounded mb-2 shadow" />
|
||||||
</div>
|
</div>
|
||||||
<div className="col-md-9 text-left mt-sm-2">
|
<div className="col-md-9 text-left mt-sm-2">
|
||||||
<h4>{item.title}</h4>
|
<h4>{item.title}</h4>
|
||||||
|
|||||||
@ -22,7 +22,11 @@ type KnownAction = RequestAction | ReceiveAction
|
|||||||
export const actionCreators = {
|
export const actionCreators = {
|
||||||
requestBlogCatalog: (props?: GetBlogCatalogRequestModel): AppThunkAction<KnownAction> => (dispatch, getState) => {
|
requestBlogCatalog: (props?: GetBlogCatalogRequestModel): AppThunkAction<KnownAction> => (dispatch, getState) => {
|
||||||
|
|
||||||
Get<Promise<GetBlogCatalogResponseModel>>('https://localhost:7151/api/BlogCatalog', props?.pathParams, props?.searchParams)
|
const locale = getState().content?.localization.locale
|
||||||
|
|
||||||
|
const searchParams = {...props?.searchParams, locale}
|
||||||
|
|
||||||
|
Get<Promise<GetBlogCatalogResponseModel>>(`${process.env.REACT_APP_API}/Image/${process.env.REACT_APP_BLOGITEMS}/${process.env.REACT_APP_SITEID}`, props?.pathParams, searchParams)
|
||||||
.then(response => response)
|
.then(response => response)
|
||||||
.then(data => {
|
.then(data => {
|
||||||
if(data)
|
if(data)
|
||||||
@ -42,7 +46,7 @@ const unloadedState: BlogCatalogState = {
|
|||||||
slug: "demo-post",
|
slug: "demo-post",
|
||||||
badges: [ "demo" ],
|
badges: [ "demo" ],
|
||||||
image: {
|
image: {
|
||||||
src: "https://dummyimage.com/850x350/dee2e6/6c757d.jpg",
|
src: `${process.env.REACT_APP_API}/Image/850x350/dee2e6/6c757d`,
|
||||||
alt: "..."
|
alt: "..."
|
||||||
},
|
},
|
||||||
title: "Lorem ipsum",
|
title: "Lorem ipsum",
|
||||||
@ -52,7 +56,7 @@ const unloadedState: BlogCatalogState = {
|
|||||||
id: "",
|
id: "",
|
||||||
nickName: "Admin",
|
nickName: "Admin",
|
||||||
image: {
|
image: {
|
||||||
src: "https://dummyimage.com/40x40/ced4da/6c757d",
|
src: `${process.env.REACT_APP_API}/Image/40x40/ced4da/6c757d`,
|
||||||
alt: "..."
|
alt: "..."
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@ -66,7 +70,7 @@ const unloadedState: BlogCatalogState = {
|
|||||||
slug: "demo-post",
|
slug: "demo-post",
|
||||||
badges: [ "demo" ],
|
badges: [ "demo" ],
|
||||||
image: {
|
image: {
|
||||||
src: "https://dummyimage.com/850x350/dee2e6/6c757d.jpg",
|
src: `${process.env.REACT_APP_API}/Image/850x350/dee2e6/6c757d`,
|
||||||
alt: "..."
|
alt: "..."
|
||||||
},
|
},
|
||||||
title: "Lorem ipsum",
|
title: "Lorem ipsum",
|
||||||
@ -76,7 +80,7 @@ const unloadedState: BlogCatalogState = {
|
|||||||
id: "",
|
id: "",
|
||||||
nickName: "Admin",
|
nickName: "Admin",
|
||||||
image: {
|
image: {
|
||||||
src: "https://dummyimage.com/40x40/ced4da/6c757d",
|
src: `${process.env.REACT_APP_API}/Image/40x40/ced4da/6c757d`,
|
||||||
alt: "..."
|
alt: "..."
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@ -90,7 +94,7 @@ const unloadedState: BlogCatalogState = {
|
|||||||
slug: "demo-post",
|
slug: "demo-post",
|
||||||
badges: [ "demo" ],
|
badges: [ "demo" ],
|
||||||
image: {
|
image: {
|
||||||
src: "https://dummyimage.com/850x350/dee2e6/6c757d.jpg",
|
src: `${process.env.REACT_APP_API}/Image/850x350/dee2e6/6c757d`,
|
||||||
alt: "..."
|
alt: "..."
|
||||||
},
|
},
|
||||||
title: "Lorem ipsum",
|
title: "Lorem ipsum",
|
||||||
@ -100,7 +104,7 @@ const unloadedState: BlogCatalogState = {
|
|||||||
id: "",
|
id: "",
|
||||||
nickName: "Admin",
|
nickName: "Admin",
|
||||||
image: {
|
image: {
|
||||||
src: "https://dummyimage.com/40x40/ced4da/6c757d",
|
src: `${process.env.REACT_APP_API}/Image/40x40/ced4da/6c757d`,
|
||||||
alt: "..."
|
alt: "..."
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@ -114,7 +118,7 @@ const unloadedState: BlogCatalogState = {
|
|||||||
slug: "demo-post",
|
slug: "demo-post",
|
||||||
badges: [ "demo" ],
|
badges: [ "demo" ],
|
||||||
image: {
|
image: {
|
||||||
src: "https://dummyimage.com/850x350/dee2e6/6c757d.jpg",
|
src: `${process.env.REACT_APP_API}/Image/850x350/dee2e6/6c757d`,
|
||||||
alt: "..."
|
alt: "..."
|
||||||
},
|
},
|
||||||
title: "Lorem ipsum",
|
title: "Lorem ipsum",
|
||||||
@ -124,7 +128,7 @@ const unloadedState: BlogCatalogState = {
|
|||||||
id: "",
|
id: "",
|
||||||
nickName: "Admin",
|
nickName: "Admin",
|
||||||
image: {
|
image: {
|
||||||
src: "https://dummyimage.com/40x40/ced4da/6c757d",
|
src: `${process.env.REACT_APP_API}/Image/40x40/ced4da/6c757d`,
|
||||||
alt: "..."
|
alt: "..."
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|||||||
@ -22,7 +22,11 @@ type KnownAction = RequestAction | ReceiveAction
|
|||||||
export const actionCreators = {
|
export const actionCreators = {
|
||||||
requestBlogCategories: (props?: GetBlogCategoriesRequestModel): AppThunkAction<KnownAction> => (dispatch, getState) => {
|
requestBlogCategories: (props?: GetBlogCategoriesRequestModel): AppThunkAction<KnownAction> => (dispatch, getState) => {
|
||||||
|
|
||||||
Get<Promise<GetBlogCategoriesResponseModel>>('https://localhost:7151/api/BlogCategories', props?.pathParams, props?.searchParams)
|
const locale = getState().content?.localization.locale
|
||||||
|
|
||||||
|
const searchParams = {...props?.searchParams, locale}
|
||||||
|
|
||||||
|
Get<Promise<GetBlogCategoriesResponseModel>>(`${process.env.REACT_APP_API}/Image/${process.env.REACT_APP_CATEGORYITEMS}/${process.env.REACT_APP_SITEID}`, props?.pathParams, searchParams)
|
||||||
.then(response => response)
|
.then(response => response)
|
||||||
.then(data => {
|
.then(data => {
|
||||||
if(data)
|
if(data)
|
||||||
|
|||||||
@ -24,9 +24,9 @@ export const actionCreators = {
|
|||||||
|
|
||||||
const locale = getState().content?.localization.locale
|
const locale = getState().content?.localization.locale
|
||||||
|
|
||||||
const searchParams = {...props?.pathParams, locale}
|
const searchParams = {...props?.searchParams, locale}
|
||||||
|
|
||||||
Get<Promise<GetBlogFeaturedResponseModel>>(`https://localhost:7151/api/BlogItems/Featured/${process.env.REACT_APP_SITEID}`, props?.pathParams, searchParams)
|
Get<Promise<GetBlogFeaturedResponseModel>>(`${process.env.REACT_APP_API}/Image/${process.env.REACT_APP_BLOGITEMS_FEAUTERED}/${process.env.REACT_APP_SITEID}`, props?.pathParams, searchParams)
|
||||||
.then(response => response)
|
.then(response => response)
|
||||||
.then(data => {
|
.then(data => {
|
||||||
if(data)
|
if(data)
|
||||||
@ -44,7 +44,7 @@ const unloadedState: BlogFeaturedState = {
|
|||||||
slug: "demo-post",
|
slug: "demo-post",
|
||||||
badges: [ "demo" ],
|
badges: [ "demo" ],
|
||||||
image: {
|
image: {
|
||||||
src: "https://dummyimage.com/850x350/dee2e6/6c757d.jpg",
|
src: `${process.env.REACT_APP_API}/Image/850x350/dee2e6/6c757d`,
|
||||||
alt: "..."
|
alt: "..."
|
||||||
},
|
},
|
||||||
title: "Lorem ipsum",
|
title: "Lorem ipsum",
|
||||||
@ -53,7 +53,7 @@ const unloadedState: BlogFeaturedState = {
|
|||||||
id: "",
|
id: "",
|
||||||
nickName: "Admin",
|
nickName: "Admin",
|
||||||
image: {
|
image: {
|
||||||
src: "https://dummyimage.com/40x40/ced4da/6c757d",
|
src: `${process.env.REACT_APP_API}/Image/40x40/ced4da/6c757d`,
|
||||||
alt: "..."
|
alt: "..."
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@ -68,7 +68,7 @@ const unloadedState: BlogFeaturedState = {
|
|||||||
slug: "demo-post",
|
slug: "demo-post",
|
||||||
badges: [ "demo" ],
|
badges: [ "demo" ],
|
||||||
image: {
|
image: {
|
||||||
src: "https://dummyimage.com/850x350/dee2e6/6c757d.jpg",
|
src: `${process.env.REACT_APP_API}/Image/850x350/dee2e6/6c757d`,
|
||||||
alt: "..."
|
alt: "..."
|
||||||
},
|
},
|
||||||
title: "Lorem ipsum",
|
title: "Lorem ipsum",
|
||||||
@ -77,7 +77,7 @@ const unloadedState: BlogFeaturedState = {
|
|||||||
id: "",
|
id: "",
|
||||||
nickName: "Admin",
|
nickName: "Admin",
|
||||||
image: {
|
image: {
|
||||||
src: "https://dummyimage.com/40x40/ced4da/6c757d",
|
src: `${process.env.REACT_APP_API}/Image/40x40/ced4da/6c757d`,
|
||||||
alt: "..."
|
alt: "..."
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@ -92,7 +92,7 @@ const unloadedState: BlogFeaturedState = {
|
|||||||
slug: "demo-post",
|
slug: "demo-post",
|
||||||
badges: [ "demo" ],
|
badges: [ "demo" ],
|
||||||
image: {
|
image: {
|
||||||
src: "https://dummyimage.com/850x350/dee2e6/6c757d.jpg",
|
src: `${process.env.REACT_APP_API}/Image/850x350/dee2e6/6c757d`,
|
||||||
alt: "..."
|
alt: "..."
|
||||||
},
|
},
|
||||||
title: "Lorem ipsum",
|
title: "Lorem ipsum",
|
||||||
@ -101,7 +101,7 @@ const unloadedState: BlogFeaturedState = {
|
|||||||
id: "",
|
id: "",
|
||||||
nickName: "Admin",
|
nickName: "Admin",
|
||||||
image: {
|
image: {
|
||||||
src: "https://dummyimage.com/40x40/ced4da/6c757d",
|
src: `${process.env.REACT_APP_API}/Image/40x40/ced4da/6c757d`,
|
||||||
alt: "..."
|
alt: "..."
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|||||||
@ -22,7 +22,11 @@ type KnownAction = RequestAction | ReceiveAction
|
|||||||
export const actionCreators = {
|
export const actionCreators = {
|
||||||
requestBlogItem: (props?: GetBlogItemRequestModel): AppThunkAction<KnownAction> => (dispatch, getState) => {
|
requestBlogItem: (props?: GetBlogItemRequestModel): AppThunkAction<KnownAction> => (dispatch, getState) => {
|
||||||
|
|
||||||
Get<Promise<GetBlogItemResponseModel>>('https://localhost:7151/api/BlogItem', props?.pathParams, props?.searchParams)
|
const locale = getState().content?.localization.locale
|
||||||
|
|
||||||
|
const searchParams = {...props?.searchParams, locale}
|
||||||
|
|
||||||
|
Get<Promise<GetBlogItemResponseModel>>(`${process.env.REACT_APP_API}/Image/${process.env.REACT_APP_BLOGITEM}/${process.env.REACT_APP_SITEID}`, props?.pathParams, searchParams)
|
||||||
.then(response => response)
|
.then(response => response)
|
||||||
.then(data => {
|
.then(data => {
|
||||||
if(data)
|
if(data)
|
||||||
@ -37,7 +41,7 @@ const unloadedState: BlogItemState = {
|
|||||||
id: "",
|
id: "",
|
||||||
slug: "demo-post",
|
slug: "demo-post",
|
||||||
image: {
|
image: {
|
||||||
src: "https://dummyimage.com/900x400/ced4da/6c757d.jpg",
|
src: `${process.env.REACT_APP_API}/Image/900x400/ced4da/6c757d`,
|
||||||
alt: "..."
|
alt: "..."
|
||||||
},
|
},
|
||||||
badges: [
|
badges: [
|
||||||
@ -56,7 +60,7 @@ const unloadedState: BlogItemState = {
|
|||||||
id: "",
|
id: "",
|
||||||
nickName: "Admin",
|
nickName: "Admin",
|
||||||
image: {
|
image: {
|
||||||
src: "https://dummyimage.com/40x40/ced4da/6c757d",
|
src: `${process.env.REACT_APP_API}/Image/40x40/ced4da/6c757d`,
|
||||||
alt: "..."
|
alt: "..."
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@ -68,7 +72,7 @@ const unloadedState: BlogItemState = {
|
|||||||
id: "",
|
id: "",
|
||||||
nickName: "Commenter Name 1",
|
nickName: "Commenter Name 1",
|
||||||
image: {
|
image: {
|
||||||
src: "https://dummyimage.com/50x50/ced4da/6c757d.jpg",
|
src: `${process.env.REACT_APP_API}/Image/50x50/ced4da/6c757d`,
|
||||||
alt: "..."
|
alt: "..."
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@ -80,7 +84,7 @@ const unloadedState: BlogItemState = {
|
|||||||
id: "",
|
id: "",
|
||||||
nickName: "Commenter Name 4",
|
nickName: "Commenter Name 4",
|
||||||
image: {
|
image: {
|
||||||
src: "https://dummyimage.com/50x50/ced4da/6c757d.jpg",
|
src: `${process.env.REACT_APP_API}/Image/50x50/ced4da/6c757d`,
|
||||||
alt: "..."
|
alt: "..."
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@ -91,7 +95,7 @@ const unloadedState: BlogItemState = {
|
|||||||
id: "",
|
id: "",
|
||||||
nickName: "Commenter Name 3",
|
nickName: "Commenter Name 3",
|
||||||
image: {
|
image: {
|
||||||
src: "https://dummyimage.com/50x50/ced4da/6c757d.jpg",
|
src: `${process.env.REACT_APP_API}/Image/50x50/ced4da/6c757d`,
|
||||||
alt: "..."
|
alt: "..."
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@ -104,7 +108,7 @@ const unloadedState: BlogItemState = {
|
|||||||
id: "",
|
id: "",
|
||||||
nickName: "Commenter Name 2",
|
nickName: "Commenter Name 2",
|
||||||
image: {
|
image: {
|
||||||
src: "https://dummyimage.com/50x50/ced4da/6c757d.jpg",
|
src: `${process.env.REACT_APP_API}/Image/50x50/ced4da/6c757d`,
|
||||||
alt: "..."
|
alt: "..."
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|||||||
@ -23,7 +23,7 @@ type KnownAction = RequestAction | ReceiveAction;
|
|||||||
export const actionCreators = {
|
export const actionCreators = {
|
||||||
requestContent: (props?: GetContentRequestModel): AppThunkAction<KnownAction> => (dispatch, getState) => {
|
requestContent: (props?: GetContentRequestModel): AppThunkAction<KnownAction> => (dispatch, getState) => {
|
||||||
|
|
||||||
Get<Promise<GetContentResponseModel>>(`https://localhost:7151/api/Content/${process.env.REACT_APP_SITEID}`, props?.pathParams, props?.searchParams)
|
Get<Promise<GetContentResponseModel>>(`${process.env.REACT_APP_API}/Image/${process.env.REACT_APP_CONTENT}/${process.env.REACT_APP_SITEID}`, props?.pathParams, props?.searchParams)
|
||||||
.then(response => response)
|
.then(response => response)
|
||||||
.then((data) => {
|
.then((data) => {
|
||||||
if(data) {
|
if(data) {
|
||||||
@ -142,7 +142,7 @@ const unloadedState: ContentState = {
|
|||||||
text: "The <code>ClientApp</code> subdirectory is a standard React application based on the <code>create-react-app</code> template. If you open a command prompt in that directory, you can run <code>yarn</code> commands such as <code>yarn test</code> or <code>yarn install</code>.",
|
text: "The <code>ClientApp</code> subdirectory is a standard React application based on the <code>create-react-app</code> template. If you open a command prompt in that directory, you can run <code>yarn</code> commands such as <code>yarn test</code> or <code>yarn install</code>.",
|
||||||
reviewer: {
|
reviewer: {
|
||||||
id: "",
|
id: "",
|
||||||
image: { src: "https://dummyimage.com/40x40/ced4da/6c757d", alt: "..." },
|
image: { src: `${process.env.REACT_APP_API}/Image/40x40/ced4da/6c757d`, alt: "..." },
|
||||||
fullName: "Admin",
|
fullName: "Admin",
|
||||||
position: "CEO, MAKS-IT"
|
position: "CEO, MAKS-IT"
|
||||||
}
|
}
|
||||||
|
|||||||
@ -79,7 +79,7 @@ const unloadedState: ShopCartState = {
|
|||||||
{
|
{
|
||||||
slug: "shop-catalog-item",
|
slug: "shop-catalog-item",
|
||||||
sku: "SKU-0",
|
sku: "SKU-0",
|
||||||
image: { src: "https://dummyimage.com/450x300/dee2e6/6c757d.jpg", alt: "..." },
|
image: { src: `${process.env.REACT_APP_API}/Image/450x300/dee2e6/6c757d`, alt: "..." },
|
||||||
title: "Shop item title",
|
title: "Shop item title",
|
||||||
brandName: "Brand & Name",
|
brandName: "Brand & Name",
|
||||||
shortText: "Lorem ipsum, dolor sit amet consectetur adipisicing elit. Eaque fugit ratione dicta mollitia. Officiis ad...",
|
shortText: "Lorem ipsum, dolor sit amet consectetur adipisicing elit. Eaque fugit ratione dicta mollitia. Officiis ad...",
|
||||||
@ -91,7 +91,7 @@ const unloadedState: ShopCartState = {
|
|||||||
{
|
{
|
||||||
slug: "shop-catalog-item",
|
slug: "shop-catalog-item",
|
||||||
sku: "SKU-0",
|
sku: "SKU-0",
|
||||||
image: { src: "https://dummyimage.com/450x300/dee2e6/6c757d.jpg", alt: "..." },
|
image: { src: `${process.env.REACT_APP_API}/Image/450x300/dee2e6/6c757d`, alt: "..." },
|
||||||
title: "Shop item title",
|
title: "Shop item title",
|
||||||
brandName: "Brand & Name",
|
brandName: "Brand & Name",
|
||||||
shortText: "Lorem ipsum, dolor sit amet consectetur adipisicing elit. Eaque fugit ratione dicta mollitia. Officiis ad...",
|
shortText: "Lorem ipsum, dolor sit amet consectetur adipisicing elit. Eaque fugit ratione dicta mollitia. Officiis ad...",
|
||||||
@ -103,7 +103,7 @@ const unloadedState: ShopCartState = {
|
|||||||
{
|
{
|
||||||
slug: "shop-catalog-item",
|
slug: "shop-catalog-item",
|
||||||
sku: "SKU-0",
|
sku: "SKU-0",
|
||||||
image: { src: "https://dummyimage.com/450x300/dee2e6/6c757d.jpg", alt: "..." },
|
image: { src: `${process.env.REACT_APP_API}/Image/450x300/dee2e6/6c757d`, alt: "..." },
|
||||||
title: "Shop item title",
|
title: "Shop item title",
|
||||||
brandName: "Brand & Name",
|
brandName: "Brand & Name",
|
||||||
shortText: "Lorem ipsum, dolor sit amet consectetur adipisicing elit. Eaque fugit ratione dicta mollitia. Officiis ad...",
|
shortText: "Lorem ipsum, dolor sit amet consectetur adipisicing elit. Eaque fugit ratione dicta mollitia. Officiis ad...",
|
||||||
|
|||||||
@ -22,7 +22,11 @@ type KnownAction = RequestAction | ReceiveAction
|
|||||||
export const actionCreators = {
|
export const actionCreators = {
|
||||||
requestShopCatalog: (props?: GetShopCatalogRequestModel): AppThunkAction<KnownAction> => (dispatch, getState) => {
|
requestShopCatalog: (props?: GetShopCatalogRequestModel): AppThunkAction<KnownAction> => (dispatch, getState) => {
|
||||||
|
|
||||||
Get<Promise<GetShopCatalogResponseModel>>('https://localhost:7151/api/ShopCatalog', props?.pathParams, props?.searchParams)
|
const locale = getState().content?.localization.locale
|
||||||
|
|
||||||
|
const searchParams = { ...props?.searchParams, locale }
|
||||||
|
|
||||||
|
Get<Promise<GetShopCatalogResponseModel>>(`${process.env.REACT_APP_API}/Image/${process.env.REACT_APP_SHOPITEMS}/${process.env.REACT_APP_SITEID}`, props?.pathParams, searchParams)
|
||||||
.then(response => response)
|
.then(response => response)
|
||||||
.then(data => {
|
.then(data => {
|
||||||
if(data)
|
if(data)
|
||||||
@ -41,7 +45,7 @@ const unloadedState: ShopCatalogState = {
|
|||||||
id: '',
|
id: '',
|
||||||
slug: "shop-catalog-item",
|
slug: "shop-catalog-item",
|
||||||
sku: "SKU-0",
|
sku: "SKU-0",
|
||||||
image: { src: "https://dummyimage.com/450x300/dee2e6/6c757d.jpg", alt: "..." },
|
image: { src: `${process.env.REACT_APP_API}/Image/450x300/dee2e6/6c757d`, alt: "..." },
|
||||||
badges: [ "sale" ],
|
badges: [ "sale" ],
|
||||||
title: "Shop item title",
|
title: "Shop item title",
|
||||||
brandName: "Brand & Name",
|
brandName: "Brand & Name",
|
||||||
@ -50,7 +54,7 @@ const unloadedState: ShopCatalogState = {
|
|||||||
text: "",
|
text: "",
|
||||||
author: {
|
author: {
|
||||||
id: '',
|
id: '',
|
||||||
image: { src: "https://dummyimage.com/40x40/ced4da/6c757d", alt: "..." },
|
image: { src: `${process.env.REACT_APP_API}/Image/40x40/ced4da/6c757d`, alt: "..." },
|
||||||
nickName: "Admin"
|
nickName: "Admin"
|
||||||
},
|
},
|
||||||
created: (new Date).toString(),
|
created: (new Date).toString(),
|
||||||
@ -65,7 +69,7 @@ const unloadedState: ShopCatalogState = {
|
|||||||
id: '',
|
id: '',
|
||||||
slug: "shop-catalog-item",
|
slug: "shop-catalog-item",
|
||||||
sku: "SKU-0",
|
sku: "SKU-0",
|
||||||
image: { src: "https://dummyimage.com/450x300/dee2e6/6c757d.jpg", alt: "..." },
|
image: { src: `${process.env.REACT_APP_API}/Image/450x300/dee2e6/6c757d`, alt: "..." },
|
||||||
badges: [ "sale" ],
|
badges: [ "sale" ],
|
||||||
title: "Shop item title",
|
title: "Shop item title",
|
||||||
brandName: "Brand & Name",
|
brandName: "Brand & Name",
|
||||||
@ -74,7 +78,7 @@ const unloadedState: ShopCatalogState = {
|
|||||||
text: "",
|
text: "",
|
||||||
author: {
|
author: {
|
||||||
id: '',
|
id: '',
|
||||||
image: { src: "https://dummyimage.com/40x40/ced4da/6c757d", alt: "..." },
|
image: { src: `${process.env.REACT_APP_API}/Image/40x40/ced4da/6c757d`, alt: "..." },
|
||||||
nickName: "Admin"
|
nickName: "Admin"
|
||||||
},
|
},
|
||||||
created: (new Date).toString(),
|
created: (new Date).toString(),
|
||||||
@ -89,7 +93,7 @@ const unloadedState: ShopCatalogState = {
|
|||||||
id: '',
|
id: '',
|
||||||
slug: "shop-catalog-item",
|
slug: "shop-catalog-item",
|
||||||
sku: "SKU-0",
|
sku: "SKU-0",
|
||||||
image: { src: "https://dummyimage.com/450x300/dee2e6/6c757d.jpg", alt: "..." },
|
image: { src: `${process.env.REACT_APP_API}/Image/450x300/dee2e6/6c757d`, alt: "..." },
|
||||||
badges: [ "sale", "out of stock" ],
|
badges: [ "sale", "out of stock" ],
|
||||||
title: "Shop item title",
|
title: "Shop item title",
|
||||||
brandName: "Brand & Name",
|
brandName: "Brand & Name",
|
||||||
@ -98,7 +102,7 @@ const unloadedState: ShopCatalogState = {
|
|||||||
text: "",
|
text: "",
|
||||||
author: {
|
author: {
|
||||||
id: '',
|
id: '',
|
||||||
image: { src: "https://dummyimage.com/40x40/ced4da/6c757d", alt: "..." },
|
image: { src: `${process.env.REACT_APP_API}/Image/40x40/ced4da/6c757d`, alt: "..." },
|
||||||
nickName: "Admin"
|
nickName: "Admin"
|
||||||
},
|
},
|
||||||
created: (new Date).toString(),
|
created: (new Date).toString(),
|
||||||
@ -113,7 +117,7 @@ const unloadedState: ShopCatalogState = {
|
|||||||
id: '',
|
id: '',
|
||||||
slug: "shop-catalog-item",
|
slug: "shop-catalog-item",
|
||||||
sku: "SKU-0",
|
sku: "SKU-0",
|
||||||
image: { src: "https://dummyimage.com/450x300/dee2e6/6c757d.jpg", alt: "..." },
|
image: { src: `${process.env.REACT_APP_API}/Image/450x300/dee2e6/6c757d`, alt: "..." },
|
||||||
badges: [ "sale" ],
|
badges: [ "sale" ],
|
||||||
title: "Shop item title",
|
title: "Shop item title",
|
||||||
brandName: "Brand & Name",
|
brandName: "Brand & Name",
|
||||||
@ -122,7 +126,7 @@ const unloadedState: ShopCatalogState = {
|
|||||||
text: "",
|
text: "",
|
||||||
author: {
|
author: {
|
||||||
id: '',
|
id: '',
|
||||||
image: { src: "https://dummyimage.com/40x40/ced4da/6c757d", alt: "..." },
|
image: { src: `${process.env.REACT_APP_API}/Image/40x40/ced4da/6c757d`, alt: "..." },
|
||||||
nickName: "Admin"
|
nickName: "Admin"
|
||||||
},
|
},
|
||||||
created: (new Date).toString(),
|
created: (new Date).toString(),
|
||||||
|
|||||||
@ -39,7 +39,7 @@ const unloadedState: ShopFeaturedState = {
|
|||||||
id: '',
|
id: '',
|
||||||
slug: "shop-catalog-item",
|
slug: "shop-catalog-item",
|
||||||
sku: "SKU-0",
|
sku: "SKU-0",
|
||||||
image: { src: "https://dummyimage.com/450x300/dee2e6/6c757d.jpg", alt: "..." },
|
image: { src: `${process.env.REACT_APP_API}/Image/450x300/dee2e6/6c757d`, alt: "..." },
|
||||||
badges: [ "sale" ],
|
badges: [ "sale" ],
|
||||||
title: "Shop item title",
|
title: "Shop item title",
|
||||||
brandName: "Brand & Name",
|
brandName: "Brand & Name",
|
||||||
@ -48,7 +48,7 @@ const unloadedState: ShopFeaturedState = {
|
|||||||
text: "",
|
text: "",
|
||||||
author: {
|
author: {
|
||||||
id: '',
|
id: '',
|
||||||
image: { src: "https://dummyimage.com/40x40/ced4da/6c757d", alt: "..." },
|
image: { src: `${process.env.REACT_APP_API}/Image/40x40/ced4da/6c757d`, alt: "..." },
|
||||||
nickName: "Admin"
|
nickName: "Admin"
|
||||||
},
|
},
|
||||||
created: (new Date).toString(),
|
created: (new Date).toString(),
|
||||||
|
|||||||
@ -38,7 +38,7 @@ const unloadedState: ShopItemState = {
|
|||||||
id: "",
|
id: "",
|
||||||
slug: "demo-post",
|
slug: "demo-post",
|
||||||
image: {
|
image: {
|
||||||
src: "https://dummyimage.com/600x700/dee2e6/6c757d.jpg",
|
src: `${process.env.REACT_APP_API}/Image/600x700/dee2e6/6c757d`,
|
||||||
alt: "..."
|
alt: "..."
|
||||||
},
|
},
|
||||||
|
|
||||||
@ -56,7 +56,7 @@ const unloadedState: ShopItemState = {
|
|||||||
id: "",
|
id: "",
|
||||||
nickName: "Admin",
|
nickName: "Admin",
|
||||||
image: {
|
image: {
|
||||||
src: "https://dummyimage.com/40x40/ced4da/6c757d",
|
src: `${process.env.REACT_APP_API}/Image/40x40/ced4da/6c757d`,
|
||||||
alt: "..."
|
alt: "..."
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@ -74,7 +74,7 @@ const unloadedState: ShopItemState = {
|
|||||||
id: "",
|
id: "",
|
||||||
nickName: "Commenter Name 1",
|
nickName: "Commenter Name 1",
|
||||||
image: {
|
image: {
|
||||||
src: "https://dummyimage.com/50x50/ced4da/6c757d.jpg",
|
src: `${process.env.REACT_APP_API}/Image/50x50/ced4da/6c757d`,
|
||||||
alt: "..."
|
alt: "..."
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@ -86,7 +86,7 @@ const unloadedState: ShopItemState = {
|
|||||||
id: "",
|
id: "",
|
||||||
nickName: "Commenter Name 4",
|
nickName: "Commenter Name 4",
|
||||||
image: {
|
image: {
|
||||||
src: "https://dummyimage.com/50x50/ced4da/6c757d.jpg",
|
src: `${process.env.REACT_APP_API}/Image/50x50/ced4da/6c757d`,
|
||||||
alt: "..."
|
alt: "..."
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@ -97,7 +97,7 @@ const unloadedState: ShopItemState = {
|
|||||||
id: "",
|
id: "",
|
||||||
nickName: "Commenter Name 3",
|
nickName: "Commenter Name 3",
|
||||||
image: {
|
image: {
|
||||||
src: "https://dummyimage.com/50x50/ced4da/6c757d.jpg",
|
src: `${process.env.REACT_APP_API}/Image/50x50/ced4da/6c757d`,
|
||||||
alt: "..."
|
alt: "..."
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@ -110,7 +110,7 @@ const unloadedState: ShopItemState = {
|
|||||||
id: "",
|
id: "",
|
||||||
nickName: "Commenter Name 2",
|
nickName: "Commenter Name 2",
|
||||||
image: {
|
image: {
|
||||||
src: "https://dummyimage.com/50x50/ced4da/6c757d.jpg",
|
src: `${process.env.REACT_APP_API}/Image/50x50/ced4da/6c757d`,
|
||||||
alt: "..."
|
alt: "..."
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|||||||
@ -39,7 +39,7 @@ const unloadedState: ShopRelatedState = {
|
|||||||
id: '',
|
id: '',
|
||||||
slug: "shop-catalog-item",
|
slug: "shop-catalog-item",
|
||||||
sku: "SKU-0",
|
sku: "SKU-0",
|
||||||
image: { src: "https://dummyimage.com/450x300/dee2e6/6c757d.jpg", alt: "..." },
|
image: { src: `${process.env.REACT_APP_API}/Image/450x300/dee2e6/6c757d`, alt: "..." },
|
||||||
badges: [ "sale", "best offer" ],
|
badges: [ "sale", "best offer" ],
|
||||||
title: "Shop item title",
|
title: "Shop item title",
|
||||||
brandName: "Brand & Name",
|
brandName: "Brand & Name",
|
||||||
@ -48,7 +48,7 @@ const unloadedState: ShopRelatedState = {
|
|||||||
text: "",
|
text: "",
|
||||||
author: {
|
author: {
|
||||||
id: '',
|
id: '',
|
||||||
image: { src: "https://dummyimage.com/40x40/ced4da/6c757d", alt: "..." },
|
image: { src: `${process.env.REACT_APP_API}/Image/40x40/ced4da/6c757d`, alt: "..." },
|
||||||
nickName: "Admin"
|
nickName: "Admin"
|
||||||
},
|
},
|
||||||
created: (new Date).toString(),
|
created: (new Date).toString(),
|
||||||
@ -63,7 +63,7 @@ const unloadedState: ShopRelatedState = {
|
|||||||
id: '',
|
id: '',
|
||||||
slug: "shop-catalog-item",
|
slug: "shop-catalog-item",
|
||||||
sku: "SKU-0",
|
sku: "SKU-0",
|
||||||
image: { src: "https://dummyimage.com/450x300/dee2e6/6c757d.jpg", alt: "..." },
|
image: { src: `${process.env.REACT_APP_API}/Image/450x300/dee2e6/6c757d`, alt: "..." },
|
||||||
badges: [ "sale", "best offer" ],
|
badges: [ "sale", "best offer" ],
|
||||||
title: "Shop item title",
|
title: "Shop item title",
|
||||||
brandName: "Brand & Name",
|
brandName: "Brand & Name",
|
||||||
@ -72,7 +72,7 @@ const unloadedState: ShopRelatedState = {
|
|||||||
text: "",
|
text: "",
|
||||||
author: {
|
author: {
|
||||||
id: '',
|
id: '',
|
||||||
image: { src: "https://dummyimage.com/40x40/ced4da/6c757d", alt: "..." },
|
image: { src: `${process.env.REACT_APP_API}/Image/40x40/ced4da/6c757d`, alt: "..." },
|
||||||
nickName: "Admin"
|
nickName: "Admin"
|
||||||
},
|
},
|
||||||
created: (new Date).toString(),
|
created: (new Date).toString(),
|
||||||
@ -87,7 +87,7 @@ const unloadedState: ShopRelatedState = {
|
|||||||
id: '',
|
id: '',
|
||||||
slug: "shop-catalog-item",
|
slug: "shop-catalog-item",
|
||||||
sku: "SKU-0",
|
sku: "SKU-0",
|
||||||
image: { src: "https://dummyimage.com/450x300/dee2e6/6c757d.jpg", alt: "..." },
|
image: { src: `${process.env.REACT_APP_API}/Image/450x300/dee2e6/6c757d`, alt: "..." },
|
||||||
badges: [ "sale", "best offer" ],
|
badges: [ "sale", "best offer" ],
|
||||||
title: "Shop item title",
|
title: "Shop item title",
|
||||||
brandName: "Brand & Name",
|
brandName: "Brand & Name",
|
||||||
@ -96,7 +96,7 @@ const unloadedState: ShopRelatedState = {
|
|||||||
text: "",
|
text: "",
|
||||||
author: {
|
author: {
|
||||||
id: '',
|
id: '',
|
||||||
image: { src: "https://dummyimage.com/40x40/ced4da/6c757d", alt: "..." },
|
image: { src: `${process.env.REACT_APP_API}/Image/40x40/ced4da/6c757d`, alt: "..." },
|
||||||
nickName: "Admin"
|
nickName: "Admin"
|
||||||
},
|
},
|
||||||
created: (new Date).toString(),
|
created: (new Date).toString(),
|
||||||
@ -111,7 +111,7 @@ const unloadedState: ShopRelatedState = {
|
|||||||
id: '',
|
id: '',
|
||||||
slug: "shop-catalog-item",
|
slug: "shop-catalog-item",
|
||||||
sku: "SKU-0",
|
sku: "SKU-0",
|
||||||
image: { src: "https://dummyimage.com/450x300/dee2e6/6c757d.jpg", alt: "..." },
|
image: { src: `${process.env.REACT_APP_API}/Image/450x300/dee2e6/6c757d`, alt: "..." },
|
||||||
badges: [ "sale", "best offer" ],
|
badges: [ "sale", "best offer" ],
|
||||||
title: "Shop item title",
|
title: "Shop item title",
|
||||||
brandName: "Brand & Name",
|
brandName: "Brand & Name",
|
||||||
@ -120,7 +120,7 @@ const unloadedState: ShopRelatedState = {
|
|||||||
text: "",
|
text: "",
|
||||||
author: {
|
author: {
|
||||||
id: '',
|
id: '',
|
||||||
image: { src: "https://dummyimage.com/40x40/ced4da/6c757d", alt: "..." },
|
image: { src: `${process.env.REACT_APP_API}/Image/40x40/ced4da/6c757d`, alt: "..." },
|
||||||
nickName: "Admin"
|
nickName: "Admin"
|
||||||
},
|
},
|
||||||
created: (new Date).toString(),
|
created: (new Date).toString(),
|
||||||
|
|||||||
@ -15,6 +15,7 @@ namespace DataProviders.Collections
|
|||||||
(ShopDocument?, IDomainResult) GetBySlug(Guid siteId, string slug);
|
(ShopDocument?, IDomainResult) GetBySlug(Guid siteId, string slug);
|
||||||
(List<ShopDocument>?, IDomainResult) GetBySlugs(Guid siteId, List<string> slugs);
|
(List<ShopDocument>?, IDomainResult) GetBySlugs(Guid siteId, List<string> slugs);
|
||||||
(List<ShopDocument>?, IDomainResult) GetAll(Guid siteId, int skip, int take);
|
(List<ShopDocument>?, IDomainResult) GetAll(Guid siteId, int skip, int take);
|
||||||
|
(int?, IDomainResult) Count(Guid siteId);
|
||||||
(Guid?, IDomainResult) Update(ShopDocument shopCart);
|
(Guid?, IDomainResult) Update(ShopDocument shopCart);
|
||||||
IDomainResult Delete(Guid id);
|
IDomainResult Delete(Guid id);
|
||||||
IDomainResult DeleteAll(Guid siteId);
|
IDomainResult DeleteAll(Guid siteId);
|
||||||
@ -56,6 +57,11 @@ namespace DataProviders.Collections
|
|||||||
public (List<ShopDocument>?, IDomainResult) GetAll(Guid siteId, int skip, int take) =>
|
public (List<ShopDocument>?, IDomainResult) GetAll(Guid siteId, int skip, int take) =>
|
||||||
GetWithPredicate(x => x.SiteId == siteId, x => x, skip, take);
|
GetWithPredicate(x => x.SiteId == siteId, x => x, skip, take);
|
||||||
|
|
||||||
|
public (int?, IDomainResult) Count(Guid siteId) {
|
||||||
|
var (list, result) = GetWithPredicate(x => x.SiteId == siteId, x => x.Id);
|
||||||
|
return (list?.Count, result);
|
||||||
|
}
|
||||||
|
|
||||||
public (Guid?, IDomainResult) Update(ShopDocument shopCart) =>
|
public (Guid?, IDomainResult) Update(ShopDocument shopCart) =>
|
||||||
UpdateWithPredicate(shopCart, x => x.Id == shopCart.Id);
|
UpdateWithPredicate(shopCart, x => x.Id == shopCart.Id);
|
||||||
|
|
||||||
|
|||||||
@ -15,53 +15,51 @@ namespace ImageProvider.Extensions {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
internal static IImageProcessingContext ApplyScalingWaterMarkSimple(this IImageProcessingContext processingContext,
|
private static IImageProcessingContext ApplyScalingWaterMarkSimple(this IImageProcessingContext processingContext,
|
||||||
Font font,
|
Font font,
|
||||||
string text,
|
string text,
|
||||||
Color color,
|
Color color,
|
||||||
float padding) {
|
float padding) {
|
||||||
Size imgSize = processingContext.GetCurrentSize();
|
Size imgSize = processingContext.GetCurrentSize();
|
||||||
|
|
||||||
float targetWidth = imgSize.Width - (padding * 2);
|
float targetWidth = imgSize.Width - (padding * 2);
|
||||||
float targetHeight = imgSize.Height - (padding * 2);
|
float targetHeight = imgSize.Height - (padding * 2);
|
||||||
|
|
||||||
// measure the text size
|
// Measure the text size
|
||||||
FontRectangle size = TextMeasurer.Measure(text, new RendererOptions(font));
|
FontRectangle size = TextMeasurer.Measure(text, new TextOptions(font));
|
||||||
|
|
||||||
//find out how much we need to scale the text to fill the space (up or down)
|
// Find out how much we need to scale the text to fill the space (up or down)
|
||||||
float scalingFactor = Math.Min(imgSize.Width / size.Width, imgSize.Height / size.Height);
|
float scalingFactor = Math.Min(targetWidth / size.Width, targetHeight / size.Height);
|
||||||
|
|
||||||
//create a new font
|
// Create a new font
|
||||||
Font scaledFont = new Font(font, scalingFactor * font.Size);
|
Font scaledFont = new Font(font, scalingFactor * font.Size);
|
||||||
|
|
||||||
var center = new PointF(imgSize.Width / 2, imgSize.Height / 2);
|
var center = new PointF(imgSize.Width / 2, imgSize.Height / 2);
|
||||||
var textGraphicOptions = new TextGraphicsOptions() {
|
var textOptions = new TextOptions(scaledFont) {
|
||||||
TextOptions = {
|
Origin = center,
|
||||||
HorizontalAlignment = HorizontalAlignment.Center,
|
HorizontalAlignment = HorizontalAlignment.Center,
|
||||||
VerticalAlignment = VerticalAlignment.Center
|
VerticalAlignment = VerticalAlignment.Center
|
||||||
}
|
|
||||||
};
|
};
|
||||||
return processingContext.DrawText(textGraphicOptions, text, scaledFont, color, center);
|
return processingContext.DrawText(textOptions, text, color);
|
||||||
}
|
}
|
||||||
|
|
||||||
internal static IImageProcessingContext ApplyScalingWaterMarkWordWrap(this IImageProcessingContext processingContext,
|
private static IImageProcessingContext ApplyScalingWaterMarkWordWrap(this IImageProcessingContext processingContext,
|
||||||
Font font,
|
Font font,
|
||||||
string text,
|
string text,
|
||||||
Color color,
|
Color color,
|
||||||
float padding) {
|
float padding) {
|
||||||
Size imgSize = processingContext.GetCurrentSize();
|
Size imgSize = processingContext.GetCurrentSize();
|
||||||
float targetWidth = imgSize.Width - (padding * 2);
|
float targetWidth = imgSize.Width - (padding * 2);
|
||||||
float targetHeight = imgSize.Height - (padding * 2);
|
float targetHeight = imgSize.Height - (padding * 2);
|
||||||
|
|
||||||
float targetMinHeight = imgSize.Height - (padding * 3); // must be with in a margin width of the target height
|
float targetMinHeight = imgSize.Height - (padding * 3); // Must be with in a margin width of the target height
|
||||||
|
|
||||||
// now we are working i 2 dimensions at once and can't just scale because it will cause the text to
|
// Now we are working in 2 dimensions at once and can't just scale because it will cause the text to
|
||||||
// reflow we need to just try multiple times
|
// reflow we need to just try multiple times
|
||||||
|
|
||||||
var scaledFont = font;
|
var scaledFont = font;
|
||||||
FontRectangle s = new FontRectangle(0, 0, float.MaxValue, float.MaxValue);
|
FontRectangle s = new FontRectangle(0, 0, float.MaxValue, float.MaxValue);
|
||||||
|
|
||||||
float scaleFactor = (scaledFont.Size / 2); // every time we change direction we half this size
|
float scaleFactor = (scaledFont.Size / 2); // Every time we change direction we half this size
|
||||||
int trapCount = (int)scaledFont.Size * 2;
|
int trapCount = (int)scaledFont.Size * 2;
|
||||||
if (trapCount < 10) {
|
if (trapCount < 10) {
|
||||||
trapCount = 10;
|
trapCount = 10;
|
||||||
@ -72,7 +70,7 @@ namespace ImageProvider.Extensions {
|
|||||||
while ((s.Height > targetHeight || s.Height < targetMinHeight) && trapCount > 0) {
|
while ((s.Height > targetHeight || s.Height < targetMinHeight) && trapCount > 0) {
|
||||||
if (s.Height > targetHeight) {
|
if (s.Height > targetHeight) {
|
||||||
if (isTooSmall) {
|
if (isTooSmall) {
|
||||||
scaleFactor = scaleFactor / 2;
|
scaleFactor /= 2;
|
||||||
}
|
}
|
||||||
|
|
||||||
scaledFont = new Font(scaledFont, scaledFont.Size - scaleFactor);
|
scaledFont = new Font(scaledFont, scaledFont.Size - scaleFactor);
|
||||||
@ -81,27 +79,26 @@ namespace ImageProvider.Extensions {
|
|||||||
|
|
||||||
if (s.Height < targetMinHeight) {
|
if (s.Height < targetMinHeight) {
|
||||||
if (!isTooSmall) {
|
if (!isTooSmall) {
|
||||||
scaleFactor = scaleFactor / 2;
|
scaleFactor /= 2;
|
||||||
}
|
}
|
||||||
scaledFont = new Font(scaledFont, scaledFont.Size + scaleFactor);
|
scaledFont = new Font(scaledFont, scaledFont.Size + scaleFactor);
|
||||||
isTooSmall = true;
|
isTooSmall = true;
|
||||||
}
|
}
|
||||||
trapCount--;
|
trapCount--;
|
||||||
|
|
||||||
s = TextMeasurer.Measure(text, new RendererOptions(scaledFont) {
|
s = TextMeasurer.Measure(text, new TextOptions(scaledFont) {
|
||||||
WrappingWidth = targetWidth
|
WrappingLength = targetWidth
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
var center = new PointF(padding, imgSize.Height / 2);
|
var center = new PointF(padding, imgSize.Height / 2);
|
||||||
var textGraphicOptions = new TextGraphicsOptions() {
|
var textOptions = new TextOptions(scaledFont) {
|
||||||
TextOptions = {
|
Origin = center,
|
||||||
HorizontalAlignment = HorizontalAlignment.Left,
|
HorizontalAlignment = HorizontalAlignment.Left,
|
||||||
VerticalAlignment = VerticalAlignment.Center,
|
VerticalAlignment = VerticalAlignment.Center,
|
||||||
WrapTextWidth = targetWidth
|
WrappingLength = targetWidth
|
||||||
}
|
|
||||||
};
|
};
|
||||||
return processingContext.DrawText(textGraphicOptions, text, scaledFont, color, center);
|
return processingContext.DrawText(textOptions, text, color);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -9,7 +9,7 @@ namespace ImageProvider.Extensions {
|
|||||||
var fontCollection = new FontCollection();
|
var fontCollection = new FontCollection();
|
||||||
|
|
||||||
foreach (var font in Directory.EnumerateFiles(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Fonts"), "*.ttf", SearchOption.AllDirectories))
|
foreach (var font in Directory.EnumerateFiles(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Fonts"), "*.ttf", SearchOption.AllDirectories))
|
||||||
fontCollection.Install(font);
|
fontCollection.Add(font);
|
||||||
|
|
||||||
return fontCollection;
|
return fontCollection;
|
||||||
});
|
});
|
||||||
|
|||||||
@ -2,12 +2,17 @@
|
|||||||
using ImageProvider.Fonts;
|
using ImageProvider.Fonts;
|
||||||
using Microsoft.Extensions.Logging;
|
using Microsoft.Extensions.Logging;
|
||||||
using SixLabors.Fonts;
|
using SixLabors.Fonts;
|
||||||
|
using SixLabors.ImageSharp.Drawing.Processing;
|
||||||
|
using SixLabors.ImageSharp.Drawing;
|
||||||
|
using static System.Net.Mime.MediaTypeNames;
|
||||||
|
using ImageProvider.Extensions;
|
||||||
|
|
||||||
namespace ImageProvider {
|
namespace ImageProvider {
|
||||||
|
|
||||||
public interface IImageProvider {
|
public interface IImageProvider {
|
||||||
(byte[]?, IDomainResult) Resize(byte[] bytes, int width, int height);
|
(byte[]?, IDomainResult) Resize(byte[] bytes, int width, int height);
|
||||||
(byte[]?, IDomainResult) ResizeAndWatermark(byte[] bytes, int width, int height, FontsEnum fontName, FontStylesEnum fontStyle, string text);
|
(byte[]?, IDomainResult) ResizeAndWatermark(byte[] bytes, int width, int height, FontsEnum fontName, FontStylesEnum fontStyle, string text);
|
||||||
|
(byte[]?, IDomainResult) CreatePlaceholder(int width, int height, string background, string foreground);
|
||||||
}
|
}
|
||||||
|
|
||||||
public class ImageProvider : IImageProvider {
|
public class ImageProvider : IImageProvider {
|
||||||
@ -60,5 +65,34 @@ namespace ImageProvider {
|
|||||||
return IDomainResult.Failed<byte[]?>();
|
return IDomainResult.Failed<byte[]?>();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public (byte[]?, IDomainResult) CreatePlaceholder(int width, int height, string backgroundHex, string foregroundHex) {
|
||||||
|
|
||||||
|
var font = _fontCollection.Families.Single(x => x.Name == FontsEnum.Montserrat.Name)
|
||||||
|
.CreateFont(10, FontStyle.Regular);
|
||||||
|
|
||||||
|
using var image = new Image<Rgba32>(width, height);
|
||||||
|
|
||||||
|
if (!Color.TryParseHex(backgroundHex, out Color backgroundColor))
|
||||||
|
backgroundColor = Color.Gray;
|
||||||
|
|
||||||
|
|
||||||
|
if (!Color.TryParseHex(foregroundHex, out Color foregroundColor))
|
||||||
|
foregroundColor = Color.White;
|
||||||
|
|
||||||
|
image.Mutate(ctx => {
|
||||||
|
ctx.BackgroundColor(backgroundColor);
|
||||||
|
ctx.ApplyScalingWaterMark(font, $"{width}x{height}", foregroundColor, 5, false);
|
||||||
|
//x.Fill(, new Rectangle(0, 0, width, height));
|
||||||
|
//x.DrawText($"{width}x{height}", font, Color.Black, new PointF(10, 10));
|
||||||
|
});
|
||||||
|
|
||||||
|
using var stream = new MemoryStream();
|
||||||
|
|
||||||
|
image.SaveAsJpeg(stream);
|
||||||
|
|
||||||
|
|
||||||
|
return IDomainResult.Success(stream.ToArray());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -10,9 +10,9 @@
|
|||||||
<PackageReference Include="DomainResult.Common" Version="3.1.0" />
|
<PackageReference Include="DomainResult.Common" Version="3.1.0" />
|
||||||
<PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="7.0.0" />
|
<PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="7.0.0" />
|
||||||
<PackageReference Include="Microsoft.Extensions.Logging.Abstractions" Version="7.0.0" />
|
<PackageReference Include="Microsoft.Extensions.Logging.Abstractions" Version="7.0.0" />
|
||||||
<PackageReference Include="SixLabors.Fonts" Version="1.0.0-beta0013" />
|
<PackageReference Include="SixLabors.Fonts" Version="1.0.0-beta19" />
|
||||||
<PackageReference Include="SixLabors.ImageSharp" Version="3.0.0" />
|
<PackageReference Include="SixLabors.ImageSharp" Version="3.0.1" />
|
||||||
<PackageReference Include="SixLabors.ImageSharp.Drawing" Version="1.0.0-beta11" />
|
<PackageReference Include="SixLabors.ImageSharp.Drawing" Version="1.0.0-beta15" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
|
|||||||
@ -9,7 +9,6 @@ using DomainResults.Common;
|
|||||||
using WeatherForecast.Policies;
|
using WeatherForecast.Policies;
|
||||||
using DomainObjects.Documents.Users;
|
using DomainObjects.Documents.Users;
|
||||||
using WeatherForecast.Controllers.Abstractions;
|
using WeatherForecast.Controllers.Abstractions;
|
||||||
using static System.Net.WebRequestMethods;
|
|
||||||
|
|
||||||
namespace WeatherForecast.Controllers;
|
namespace WeatherForecast.Controllers;
|
||||||
|
|
||||||
@ -146,6 +145,33 @@ public class ImageController : AuthorizationControllerBase {
|
|||||||
FileDownloadName = file.Name
|
FileDownloadName = file.Name
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Site wide
|
||||||
|
/// <para>
|
||||||
|
/// Allowed everyone
|
||||||
|
/// </para>
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="siteId"></param>
|
||||||
|
/// <param name="width"></param>
|
||||||
|
/// <param name="height"></param>
|
||||||
|
/// <param name="background"></param>
|
||||||
|
/// <param name="foreground"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
[HttpGet("{width}x{height}/{background}/{foreground}")]
|
||||||
|
public IActionResult Get([FromRoute] int width, [FromRoute] int height, [FromRoute] string background, [FromRoute] string foreground) {
|
||||||
|
|
||||||
|
var (file, result) = _imageService.Get(width, height, background, foreground);
|
||||||
|
|
||||||
|
if (!result.IsSuccess || file == null)
|
||||||
|
return result.ToActionResult();
|
||||||
|
|
||||||
|
var stream = new MemoryStream(file.Bytes);
|
||||||
|
return new FileStreamResult(stream, file.ContentType) {
|
||||||
|
FileDownloadName = file.Name
|
||||||
|
};
|
||||||
|
}
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
#region Update
|
#region Update
|
||||||
|
|||||||
@ -32,10 +32,10 @@ namespace WeatherForecast.Models.Cetegories.Requests {
|
|||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
public IEnumerable<ValidationResult> Validate(ValidationContext validationContext) {
|
public IEnumerable<ValidationResult> Validate(ValidationContext validationContext) {
|
||||||
|
|
||||||
if (CurrentPage > 0)
|
if (CurrentPage < 1)
|
||||||
yield return new ValidationResult($"{Errors.WrongOrNotManaged} {nameof(CurrentPage)}");
|
yield return new ValidationResult($"{Errors.WrongOrNotManaged} {nameof(CurrentPage)}");
|
||||||
|
|
||||||
if (ItemsPerPage > 0)
|
if (ItemsPerPage < 1)
|
||||||
yield return new ValidationResult($"{Errors.WrongOrNotManaged} {nameof(ItemsPerPage)}");
|
yield return new ValidationResult($"{Errors.WrongOrNotManaged} {nameof(ItemsPerPage)}");
|
||||||
|
|
||||||
if (Locale == Locales.Unknown)
|
if (Locale == Locales.Unknown)
|
||||||
|
|||||||
@ -11,6 +11,8 @@ using Core.Abstractions;
|
|||||||
using WeatherForecast.Models.Images.Responses;
|
using WeatherForecast.Models.Images.Responses;
|
||||||
using Microsoft.AspNetCore.Mvc;
|
using Microsoft.AspNetCore.Mvc;
|
||||||
using DomainObjects.Documents.Users;
|
using DomainObjects.Documents.Users;
|
||||||
|
using Org.BouncyCastle.Bcpg.OpenPgp;
|
||||||
|
using DomainObjects.Documents.Sites;
|
||||||
|
|
||||||
namespace WeatherForecast.Services {
|
namespace WeatherForecast.Services {
|
||||||
|
|
||||||
@ -42,6 +44,16 @@ namespace WeatherForecast.Services {
|
|||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
(GetImageResponseModel?, IDomainResult) Get([FromRoute] Guid siteId, [FromRoute] Guid? userId, [FromRoute] Guid fileId);
|
(GetImageResponseModel?, IDomainResult) Get([FromRoute] Guid siteId, [FromRoute] Guid? userId, [FromRoute] Guid fileId);
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
///
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="width"></param>
|
||||||
|
/// <param name="height"></param>
|
||||||
|
/// <param name="background"></param>
|
||||||
|
/// <param name="foreground"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
(GetImageResponseModel?, IDomainResult) Get(int width, int height, string background, string foreground);
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
///
|
///
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@ -174,6 +186,26 @@ namespace WeatherForecast.Services {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
///
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="width"></param>
|
||||||
|
/// <param name="height"></param>
|
||||||
|
/// <param name="background"></param>
|
||||||
|
/// <param name="foreground"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
public (GetImageResponseModel?, IDomainResult) Get(int width, int height, string background, string foreground) {
|
||||||
|
var (file, downloadResult) = _imageProvider.CreatePlaceholder(width, height, background, foreground);
|
||||||
|
if (!downloadResult.IsSuccess || file == null)
|
||||||
|
return (null, downloadResult);
|
||||||
|
|
||||||
|
return IDomainResult.Success(new GetImageResponseModel() {
|
||||||
|
Name = "Dummy.jpg",
|
||||||
|
Bytes = file,
|
||||||
|
ContentType = "image/jpeg"
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
///
|
///
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
|||||||
@ -7,6 +7,7 @@ using DomainObjects.Documents;
|
|||||||
using DomainObjects.Enumerations;
|
using DomainObjects.Enumerations;
|
||||||
using WeatherForecast.Models.ShopCart.Requests;
|
using WeatherForecast.Models.ShopCart.Requests;
|
||||||
using WeatherForecast.Models.ShopCart.Responses;
|
using WeatherForecast.Models.ShopCart.Responses;
|
||||||
|
using DomainObjects.Documents.Sites;
|
||||||
|
|
||||||
namespace WeatherForecast.Services
|
namespace WeatherForecast.Services
|
||||||
{
|
{
|
||||||
@ -55,7 +56,16 @@ namespace WeatherForecast.Services
|
|||||||
/// <param name="requestData"></param>
|
/// <param name="requestData"></param>
|
||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
public (List<GetShopCartItemLocalizedResponseModel>?, IDomainResult) Get(List<ShopCartDocument> cartItems, GetShopCartItemsLocalizedRequestModel requestData) {
|
public (List<GetShopCartItemLocalizedResponseModel>?, IDomainResult) Get(List<ShopCartDocument> cartItems, GetShopCartItemsLocalizedRequestModel requestData) {
|
||||||
|
|
||||||
|
//var (count, getCountResult) = _shopCatalogDataProvider.Count(siteId);
|
||||||
|
//if (!getCountResult.IsSuccess || count == null)
|
||||||
|
// return (null, getCountResult);
|
||||||
|
|
||||||
|
//var skip = (requestData.CurrentPage - 1) * requestData.ItemsPerPage;
|
||||||
|
//var take = requestData.ItemsPerPage;
|
||||||
|
|
||||||
|
//var totalPages = (int)Math.Ceiling((decimal)count / take);
|
||||||
|
|
||||||
var items = new List<GetShopCartItemLocalizedResponseModel>();
|
var items = new List<GetShopCartItemLocalizedResponseModel>();
|
||||||
foreach (var cartItem in cartItems) {
|
foreach (var cartItem in cartItems) {
|
||||||
var (item, result) = _shopCatalogDataProvider.Get(cartItem.Id, cartItem.Sku);
|
var (item, result) = _shopCatalogDataProvider.Get(cartItem.Id, cartItem.Sku);
|
||||||
|
|||||||
@ -65,27 +65,35 @@ namespace WeatherForecast.Services {
|
|||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
public (GetShopItemsLocalizedResponseModel?, IDomainResult) Get(Guid siteId, GetShopItemsLocalizedRequestModel requestData) {
|
public (GetShopItemsLocalizedResponseModel?, IDomainResult) Get(Guid siteId, GetShopItemsLocalizedRequestModel requestData) {
|
||||||
try {
|
try {
|
||||||
var (items, result) = _shopCatalogDataProvider.GetAll(siteId, (requestData.CurrentPage - 1) * requestData.ItemsPerPage, requestData.ItemsPerPage);
|
var (count, getCountResult) = _shopCatalogDataProvider.Count(siteId);
|
||||||
|
if (!getCountResult.IsSuccess || count == null)
|
||||||
|
return (null, getCountResult);
|
||||||
|
|
||||||
if (!result.IsSuccess || items == null)
|
var skip = (requestData.CurrentPage - 1) * requestData.ItemsPerPage;
|
||||||
return (null, result);
|
var take = requestData.ItemsPerPage;
|
||||||
|
|
||||||
var shopItems = new List<GetShopItemLocalizedResponseModel>();
|
var totalPages = (int)Math.Ceiling((decimal)count / take);
|
||||||
foreach (var item in items) {
|
|
||||||
|
|
||||||
var (categories, getCategoryResult) = _categoryDataProvider.GetMany(siteId, item.Categories);
|
var (shopItems, getShopItemsResult) = _shopCatalogDataProvider.GetAll(siteId, skip, take);
|
||||||
|
if (!getShopItemsResult.IsSuccess || shopItems == null)
|
||||||
|
return (null, getShopItemsResult);
|
||||||
|
|
||||||
|
var result = new List<GetShopItemLocalizedResponseModel>();
|
||||||
|
foreach (var shopItem in shopItems) {
|
||||||
|
|
||||||
|
var (categories, getCategoryResult) = _categoryDataProvider.GetMany(siteId, shopItem.Categories);
|
||||||
if (!getCategoryResult.IsSuccess || categories == null)
|
if (!getCategoryResult.IsSuccess || categories == null)
|
||||||
return IDomainResult.Failed<GetShopItemsLocalizedResponseModel?>();
|
return IDomainResult.Failed<GetShopItemsLocalizedResponseModel?>();
|
||||||
|
|
||||||
var (author, getAuthor) = _userDataProvider.Get(item.Author);
|
var (author, getAuthor) = _userDataProvider.Get(shopItem.Author);
|
||||||
if (!getAuthor.IsSuccess || author == null)
|
if (!getAuthor.IsSuccess || author == null)
|
||||||
return IDomainResult.Failed<GetShopItemsLocalizedResponseModel?>();
|
return IDomainResult.Failed<GetShopItemsLocalizedResponseModel?>();
|
||||||
|
|
||||||
shopItems.Add(new GetShopItemLocalizedResponseModel(item, categories, author, requestData.Locale));
|
result.Add(new GetShopItemLocalizedResponseModel(shopItem, categories, author, requestData.Locale));
|
||||||
}
|
}
|
||||||
|
|
||||||
return shopItems.Count > 0
|
return result.Count > 0
|
||||||
? IDomainResult.Success(new GetShopItemsLocalizedResponseModel(requestData.CurrentPage, 0, shopItems))
|
? IDomainResult.Success(new GetShopItemsLocalizedResponseModel(requestData.CurrentPage, totalPages, result))
|
||||||
: IDomainResult.NotFound<GetShopItemsLocalizedResponseModel?>();
|
: IDomainResult.NotFound<GetShopItemsLocalizedResponseModel?>();
|
||||||
}
|
}
|
||||||
catch (Exception ex) {
|
catch (Exception ex) {
|
||||||
|
|||||||
@ -24,11 +24,11 @@
|
|||||||
<PackageReference Include="Microsoft.AspNetCore.Authentication.JwtBearer" Version="7.0.4" />
|
<PackageReference Include="Microsoft.AspNetCore.Authentication.JwtBearer" Version="7.0.4" />
|
||||||
<PackageReference Include="Microsoft.VisualStudio.Azure.Containers.Tools.Targets" Version="1.18.1" />
|
<PackageReference Include="Microsoft.VisualStudio.Azure.Containers.Tools.Targets" Version="1.18.1" />
|
||||||
<PackageReference Include="Serilog.Enrichers.Span" Version="3.1.0" />
|
<PackageReference Include="Serilog.Enrichers.Span" Version="3.1.0" />
|
||||||
<PackageReference Include="Serilog.Expressions" Version="3.4.1" />
|
<PackageReference Include="Serilog.Expressions" Version="3.4.1" />
|
||||||
<PackageReference Include="Serilog.Extensions.Hosting" Version="5.0.1" />
|
<PackageReference Include="Serilog.Extensions.Hosting" Version="5.0.1" />
|
||||||
<PackageReference Include="Serilog.Extensions.Logging" Version="3.1.0" />
|
<PackageReference Include="Serilog.Extensions.Logging" Version="3.1.0" />
|
||||||
<PackageReference Include="Serilog.Settings.Configuration" Version="3.4.0" />
|
<PackageReference Include="Serilog.Settings.Configuration" Version="3.4.0" />
|
||||||
<PackageReference Include="Serilog.Sinks.Console" Version="4.1.0" />
|
<PackageReference Include="Serilog.Sinks.Console" Version="4.1.0" />
|
||||||
<PackageReference Include="Swashbuckle.AspNetCore" Version="6.5.0" />
|
<PackageReference Include="Swashbuckle.AspNetCore" Version="6.5.0" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
|
|||||||
@ -31,6 +31,14 @@ services:
|
|||||||
networks:
|
networks:
|
||||||
- "my-network"
|
- "my-network"
|
||||||
|
|
||||||
|
#clientapp:
|
||||||
|
# environment:
|
||||||
|
# - ASPNETCORE_ENVIRONMENT=Development
|
||||||
|
# ports:
|
||||||
|
# - "3000:3000"
|
||||||
|
# networks:
|
||||||
|
# - "my-network"
|
||||||
|
|
||||||
mongo:
|
mongo:
|
||||||
image: mongo
|
image: mongo
|
||||||
restart: always
|
restart: always
|
||||||
|
|||||||
@ -11,4 +11,9 @@ services:
|
|||||||
build:
|
build:
|
||||||
context: .
|
context: .
|
||||||
dockerfile: ReverseProxy/Dockerfile
|
dockerfile: ReverseProxy/Dockerfile
|
||||||
|
#clientapp:
|
||||||
|
# image: ${DOCKER_REGISTRY-}clientapp
|
||||||
|
# build:
|
||||||
|
# context: .
|
||||||
|
# dockerfile: ClientApp/Dockerfile
|
||||||
|
|
||||||
|
|||||||
@ -3,4 +3,4 @@ WiredTiger 10.0.2: (December 21, 2021)
|
|||||||
WiredTiger version
|
WiredTiger version
|
||||||
major=10,minor=0,patch=2
|
major=10,minor=0,patch=2
|
||||||
file:WiredTiger.wt
|
file:WiredTiger.wt
|
||||||
access_pattern_hint=none,allocation_size=4KB,app_metadata=,assert=(commit_timestamp=none,durable_timestamp=none,read_timestamp=none,write_timestamp=off),block_allocation=best,block_compressor=,cache_resident=false,checksum=on,collator=,columns=,dictionary=0,encryption=(keyid=,name=),format=btree,huffman_key=,huffman_value=,id=0,ignore_in_memory_cache_size=false,internal_item_max=0,internal_key_max=0,internal_key_truncate=true,internal_page_max=4KB,key_format=S,key_gap=10,leaf_item_max=0,leaf_key_max=0,leaf_page_max=32KB,leaf_value_max=0,log=(enabled=true),memory_page_image_max=0,memory_page_max=5MB,os_cache_dirty_max=0,os_cache_max=0,prefix_compression=false,prefix_compression_min=4,readonly=false,split_deepen_min_child=0,split_deepen_per_child=0,split_pct=90,tiered_object=false,tiered_storage=(auth_token=,bucket=,bucket_prefix=,cache_directory=,local_retention=300,name=,object_target_size=0),value_format=S,verbose=[],version=(major=1,minor=1),write_timestamp_usage=none,checkpoint=(WiredTigerCheckpoint.123211=(addr="018081e4f52354c18181e493d377368281e4a22aa0f5808080e301ffc0e3010fc0",order=123211,time=1679862041,size=81920,newest_start_durable_ts=0,oldest_start_ts=0,newest_txn=154,newest_stop_durable_ts=0,newest_stop_ts=-1,newest_stop_txn=-11,prepare=0,write_gen=370276,run_write_gen=370143)),checkpoint_backup_info=,checkpoint_lsn=(70,62976)
|
access_pattern_hint=none,allocation_size=4KB,app_metadata=,assert=(commit_timestamp=none,durable_timestamp=none,read_timestamp=none,write_timestamp=off),block_allocation=best,block_compressor=,cache_resident=false,checksum=on,collator=,columns=,dictionary=0,encryption=(keyid=,name=),format=btree,huffman_key=,huffman_value=,id=0,ignore_in_memory_cache_size=false,internal_item_max=0,internal_key_max=0,internal_key_truncate=true,internal_page_max=4KB,key_format=S,key_gap=10,leaf_item_max=0,leaf_key_max=0,leaf_page_max=32KB,leaf_value_max=0,log=(enabled=true),memory_page_image_max=0,memory_page_max=5MB,os_cache_dirty_max=0,os_cache_max=0,prefix_compression=false,prefix_compression_min=4,readonly=false,split_deepen_min_child=0,split_deepen_per_child=0,split_pct=90,tiered_object=false,tiered_storage=(auth_token=,bucket=,bucket_prefix=,cache_directory=,local_retention=300,name=,object_target_size=0),value_format=S,verbose=[],version=(major=1,minor=1),write_timestamp_usage=none,checkpoint=(WiredTigerCheckpoint.124102=(addr="018381e487d81b1f8481e4bf0e4b478581e4ba5850aa808080e301ffc0e3010fc0",order=124102,time=1680030284,size=81920,newest_start_durable_ts=0,oldest_start_ts=0,newest_txn=29,newest_stop_durable_ts=0,newest_stop_ts=-1,newest_stop_txn=-11,prepare=0,write_gen=372999,run_write_gen=372970)),checkpoint_backup_info=,checkpoint_lsn=(73,16000)
|
||||||
|
|||||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@ -4,7 +4,11 @@
|
|||||||
"commandName": "DockerCompose",
|
"commandName": "DockerCompose",
|
||||||
"commandVersion": "1.0",
|
"commandVersion": "1.0",
|
||||||
"serviceActions": {
|
"serviceActions": {
|
||||||
"weatherforecast": "StartDebugging"
|
"mongo": "StartWithoutDebugging",
|
||||||
|
"mongo-express": "StartWithoutDebugging",
|
||||||
|
"reverseproxy": "StartWithoutDebugging",
|
||||||
|
"weatherforecast": "StartDebugging",
|
||||||
|
// "clientapp": "StartDebugging"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user