/flutter-axelor-sdk

Powerful, helpfull, extensible and highly customizable API's that wrap http client to make communication easier with Axelor server with boilerplate code free.

Primary LanguageDartBSD 3-Clause "New" or "Revised" LicenseBSD-3-Clause

logo

Build Status Code Coverage Pub Package
style: effective dart BSD-3 License

flutter_axelor_sdk

Powerful, helpful, extensible and highly customizable API's that wrap http client to make communication easier with Axelor server with boilerplate code free.

Table of contents

Get Started

Add dependency

flutter_axelor_sdk:  
    flutter_axelor_sdk: ^0.0.1

initial in main.dart

void main()  {
  Axelor.initialize(
    builder: AxelorBuilder(
      client: Dio(),
      domain: 'com.axelor.testserver.base.db.', // replace with your axelor server prefix
    ),
  );
  runApp(const App());
}

Example

Let's take searching for contacts example (with pagination and complex search criteria)

Axelor.search(
  model: Contacts.model,                      // auto end point construct
  baseDomain: Contacts.baseDomain,            // auto end point construct
  mapper: Contacts.fromJson,                  // Auto json decode and map to class object
  page: 0,                                    // page pagination support
  body: AxelorBody(                           // Syntactic sugar to construct body
    fields: const ['fullName', 'email'],
    sortBy: const ['fullName', '-createdOn'],
    criteria: AxelorCriteria.or([
      'email'.like('%gmail.com'),
      'lang'.equal('FR'),
      'age'.between('18', '40'),
      AxelorCriteria.and(['firstName'.like('j%'), 'lastName'.like('s%')])
    ]),
  ),
);

If we want to achieve the same function without Axelor Sdk

try {
  final response = await client.post(
    '/ws/rest/com.axelor.contact.db.Contact/search',
    data: {
      'offset': 0,
      'limit': 10,
      'fields': ['fullName', 'email'],
      'sortBy': ['fullName', '-createdOn'],
      'data': {
        'criteria': [
          {
            'operator': 'or',
            'criteria': [
              {'fieldName': 'email', 'operator': 'like', 'value': '%gmail.com'},
              {'fieldName': 'lang', 'operator': '=', 'value': 'FR'},
              {'fieldName': 'age', 'operator': 'between', 'value': 18, 'value2': 40},
              {
                'operator': 'and',
                'criteria': [
                  {'fieldName': 'firstName', 'operator': 'like', 'value': 'j%'},
                  {'fieldName': 'lastName', 'operator': 'like', 'value': 's%'}
                ]
              }
            ]
          }
        ]
      }
    },
  );
  // decode to json
  final Map<String, dynamic> jsonResponse = jsonDecode(response.data);
  // check if success response or error happen
  if ((jsonResponse['status'] as int?) != 0) {
    // propagate error to ui
    return;
  }

  // map json to Contact Class
  final contacts = Contacts.fromJson(jsonResponse['data']);
} catch (ex, st) {
  // propagate general error to ui
}

Features

  • Compatible: Compatible with all your existing code so you can adopt when and where you want.
  • Less code: Do more with less code and avoid entire classes of bugs, so code is simple and easy to maintain.
  • Highly customizable : The defaults settings will cover you but if not almost every thing is customizable.
  • Architecture-agnostic: Works with any architecture approach.
  • enterprise-ready: All code is fully tested so it's save to use in production.
  • well documented: Each feature is well documented.

Axelor APIs

You can discover all api's features in documentation. Each api is well documented .

Contributing

👋 Want to contribute to Abdktefane/flutter_axelor_sdk?

If you have a bug or an idea, read the contributing guidelines before opening an issue.